SQL Server SET DATEFIRST 作用范围

11
我正在使用 SS 2005。我看到了类似以下代码的示例:
DECLARE @restore = SELECT @@DATEFIRST
SET DATEFIRST 1
SELECT datepart(dw,ADateTimeColumn) as MondayBasedDate,.... FROM famousShipwrecks --
SET DATEFIRST @restore

假设当查询正在运行时,另一个查询设置了DATEFIRST值?

如果另一个查询依赖于日期第一天是7(例如),并且没有设置它,并在我的查询正在运行时运行,那么这是他的问题,因为他没有设置它吗?还是有更好的方法来编写依赖于某一天为第一天的查询。

4个回答

26

@@DATEFIRST 是与您的会话相关的本地设置。您可以通过在 Sql Server Management Studio (SSMS) 中打开两个选项卡并在第一个选项卡中执行以下代码来进行验证:

 SET DATEFIRST 5

通过以下步骤验证它不会影响其他标签页:

select @@datefirst

请参阅此MSDN文章

1
如果您要编写一个存储过程,它将构成整个会话——作为水晶报表的唯一数据源,并且没有机会更改或重用该SP,则恢复原始值没有意义。 - Pride Fallon
1
同意,但是可能Crystal Reports缓存了连接。因此恢复原始值也无妨。 - Andomar

3

你可以忘记 DATEPART(weekday, DateColumn)@@DATEFIRST,而是自己计算一周中的日期。

对于以星期一为基础的一周(欧洲),最简单的方法是:

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay

对于以星期日为基准的周(美国),请使用:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay

自1753年1月1日和7日以来,这个程序一直运行良好。


就像老菲利普·斯坦霍普曾经说过的那样,"忘记历史的人注定要使用DATEFIRST。" - ourmandave

2

额外提一点,如果您想避免设置DATEFIRST,您可以在查询中包含DATEFIRST的值来查找所需的日期:

    SELECT (datepart(dw,ADateTimeColumn) + @@DATEFIRST) % 7)  as 'MondayBasedDate'
    , ...
    FROM famousShipwrecks --

那么你完全不需要担心恢复它的问题!

5
这个公式不会返回以星期一为1,星期日为7的日期格式。如果要让星期一为1,星期日为7,请使用以下修改:(datepart(WEEKDAY, ADateTimeColumn) + @@DATEFIRST - 2 ) % 7 + 1 - Jan Obrestad

0

要设置一个带参数的一周第一天,可以使用以下方法

DECLARE @FirstDayOfWeek INT = 1;
DECLARE @DateTime DATETIME = '2015-07-14 8:00:00';
SELECT (DATEPART(weekday, @DateTime) + @@DateFirst - @FirstDayOfWeek - 1) % 7 + 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接