SQL Server SET DATEFIRST范围

时间:2009-05-19 14:28:52

标签: sql sql-server

我正在使用SS 2005

我见过像

这样的示例代码
DECLARE @restore = SELECT @@DATEFIRST
SET DATEFIRST 1
SELECT datepart(dw,ADateTimeColumn) as MondayBasedDate,.... FROM famousShipwrecks --
SET DATEFIRST @restore

假设查询正在运行,另一个查询设置DATEFIRST?

如果另一个查询依赖于datefirst为7(例如)并且没有设置它,并且在我的查询运行时运行,那么他的问题是不设置它?或者是否有更好的方法来编写依赖于给定日期为第1天的查询。

4 个答案:

答案 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日起,这项工作正常。