我正在使用SS 2005
我见过像
这样的示例代码DECLARE @restore = SELECT @@DATEFIRST
SET DATEFIRST 1
SELECT datepart(dw,ADateTimeColumn) as MondayBasedDate,.... FROM famousShipwrecks --
SET DATEFIRST @restore
假设查询正在运行,另一个查询设置DATEFIRST?
如果另一个查询依赖于datefirst为7(例如)并且没有设置它,并且在我的查询运行时运行,那么他的问题是不设置它?或者是否有更好的方法来编写依赖于给定日期为第1天的查询。
答案 0 :(得分:16)
@@ DATEFIRST是您的会话的本地。您可以通过打开Sql Server Management Studio(SSMS)中的选项卡来验证它。在第一个选项卡中执行此代码:
SET DATEFIRST 5
并确认它不会影响其他标签:
select @@datefirst
请参阅此MSDN article。
答案 1 :(得分:2)
还有一点,如果您想避免设置DATEFIRST,您只需在查询中加入DATEFIRST的值即可找到您所需的日期:
SELECT (datepart(dw,ADateTimeColumn) + @@DATEFIRST) % 7) as 'MondayBasedDate'
, ...
FROM famousShipwrecks --
然后你根本不用担心恢复它!
答案 2 :(得分:0)
要设置参数化的一周中的第一天,以下内容应该可以正常工作
DECLARE @FirstDayOfWeek INT = 1;
DECLARE @DateTime DATETIME = '2015-07-14 8:00:00';
SELECT (DATEPART(weekday, @DateTime) + @@DateFirst - @FirstDayOfWeek - 1) % 7 + 1;
答案 3 :(得分:0)
您可以忘记DATEPART(weekday, DateColumn)
和@@DATEFIRST
,而是自己计算一周中的某一天。
对于周一的周(欧洲),最简单的是:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
对于周日周(美国)使用:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
自1753年7月1日起,这项工作正常。