我正在将一些MS Access查询转换为T-SQL(用于SQL报告服务),我遇到了一个问题。
在MS Access查询中,有一个名为DATEPART的函数,它有两个可选参数(相应的T-SQL DATEPART函数没有的参数):firstdayofweek和firstweekofyear。我无法弄清楚如何在T-SQL中创建等效查询。
以下是原始的MS Access查询(仅限于相关数据):
SELECT datepart("ww",OrderDate, 7, 2) AS WeekNumber FROM Orders;
注意:在这种情况下,7表示计算星期六作为一周的第一天,2表示计算一年中的第一周作为第一周,有4(或更多)天。
如何在T-SQL中执行此操作?
答案 0 :(得分:2)
您引用的参数是:
<强> Firstdayofweek可强>
省略,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));
下一个论点是:
<强> firstweekofyear 强>
可选。它是一个常量,指定一年中的第一周。如果省略此参数,则Access假定包含Jan 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日的周数,然后在每次传递时增加1,设置为DATEFIRST
相当于vbFirstFourDays
的最接近的是使用DATEPART(ISO_WEEK, @Date)
,ISO标准将一年中的第一周定义为包含4天的第一周,这不完全等同,因为这不受影响根据{{1}},ISO标准将周定义为星期一到星期日,因此DATEFIRST
也可以,无论ISO_WEEK
还是区域设置。
DATEFIRST
没有任何等价物。
我发现通常业务逻辑规定了对周数或日数的这些标准定义的任何偏差,因此这几乎总是最好通过建立自己calendar table来处理,然后你可以添加你的它的新列,并运行一次性更新。例如,我必须报告周四到周三的佣金支付周数,其中一年的第一周被定义为第一个完整的一周(所以在访问时这将是vbFirstFullWeek
),没有相应的MS SQL中的函数我在日历表DATEPART("ww", [Date], 4, 5)
中添加了一个新列,然后我可以加入我的日历表来获取周数:
PaperSalesCommissionWeekNumber