繁体   English   中英

将MS Access查询转换为T-SQL-datepart函数

[英]Converting MS Access query to T-SQL - datepart function

我正在将一些MS Access查询转换为T-SQL(用于SQL报告服务),但是遇到了问题。

在MS Access查询中,有一个名为DATEPART的函数,该函数具有两个可选参数(相应的T-SQL DATEPART函数不具有的参数):firstdayofweek和firstfirstofofyear。 而且我不知道如何在T-SQL中创建等效查询。

以下是原始的MS Access查询(仅精简为相关数据):

SELECT datepart("ww",OrderDate, 7, 2) AS WeekNumber FROM Orders;

注意:在这种情况下,7表示将星期六作为一周的第一天,而2表示将一年中的第一星期作为第四(或更多)天的第一周。

如何在T-SQL中执行此操作?

您引用的参数是:

一周的第一天

省略,Access假定星期日是一周的第一天。 此参数可以是下列值之一:

Constant    Value       Explanation
------------------------------------------------
vbUseSystem     0       Use the NLS API setting
vbSunday        1       Sunday (default)
vbMonday        2       Monday
vbTuesday       3       Tuesday
vbWednesday     4       Wednesday
vbThursday      5       Thursday
vbFriday        6       Friday
vbSaturday      7       Saturday

SQL Server SET DATEFIRST的等效项,请注意,此操作从星期一开始,而不是星期日,因此以下命令将返回2(因为今天是星期二);

SET DATEFIRST 1;
SELECT [WEEKDAY] = DATEPART(WEEKDAY, CAST('2015-08-11' AS DATE));

下一个参数是:

每年的第一周

可选的。 它是一个常数,用于指定一年中的第一周。 如果省略此参数,Access将假定包含1月1日的那一周是一年中的第一周。 此参数可以是下列值之一:

Constant            Value   Explanation
---------------------------------------------------------------------------
vbUseSystem         0       Use the NSL API setting
vbFirstJan1         1       Use the first week that includes Jan 1st (default)
vbFirstFourDays     2       Use the first week in the year that has at least 4 days
vbFirstFullWeek     3       Use the first full week of the year

标准DATEPART(WEEK, @Date)等效于vbFirstJan1 ,这将在1月1日的第一天重置周号,然后在每次传递设置为DATEFIRST时都增加1。

该clostest相当于vbFirstFourDays是使用DATEPART(ISO_WEEK, @Date) ,ISO标准定义了一年的第一周的第一周包含4天,这不完全等效的,因为这不是受影响DATEFIRST的ISO标准将星期定义为星期一至星期日,因此ISO_WEEK也将其定义为星期三,无论DATEFIRST或区域设置如何。

vbFirstFullWeek完全没有等效项。

我发现通常是由业务逻辑决定与这些标准的周数或天数定义之间的偏差,因此,通常最好通过构建自己的日历表来最好地解决这一问题,然后可以向其中添加新列,然后运行一次更新。 例如,我不得不报告从周四到周三的几周以支付佣金,其中一年的第一周被定义为第一周(因此,访问权限为DATEPART("ww", [Date], 4, 5) ),在MS SQL中没有等效功能,所以我在日历表PaperSalesCommissionWeekNumber添加了新列,然后我可以加入日历表以获取星期数:

SELECT  c.PaperSalesCommissionWeekNumber
FROM    dbo.Deal AS d
        INNER JOIN dbo.Calender AS c
            ON d.DealDate = c.DateKey;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM