如何在SQL Server中将星期一设置为星期的第一天

时间:2013-11-17 14:24:21

标签: sql-server sql-server-2008 dayofweek

我在具有区域设置的计算机上运行SQL Server 2008,该区域设置将星期一作为一周的第一天。如果我在一个表中创建一个计算列来计算一个日期字段的星期几,那么我得到2表示星期一而不是1。

我需要设置表或数据库或服务器的某些属性吗?

4 个答案:

答案 0 :(得分:23)

一周的第一天基于您的服务器语言设置。 us_english的默认设置为7(星期日)

您可以使用SELECT @@DATEFIRST

找到当前的第一天

但是,您可以使用DATEFIRST。只需将其放在查询的顶部

即可

SET DATEFIRST 1;这会将星期一设置为当前连接的一周的第一天。

http://technet.microsoft.com/en-us/library/ms181598.aspx

答案 1 :(得分:5)

只需在查询中设置

设置DATEFIRST 1;

值 一周的第一天是 1星期一 2星期二 3星期三 4星期四 5星期五 6星期六  7(默认,美国英语)星期日

答案 2 :(得分:1)

您可以使用DATEPART(dw, GETDATE()),但是请注意,结果将取决于SQL Server设置@@DATEFIRST的值,该值是一周的第一天设置(在欧洲,默认值7是星期日)。

另一种方法是显式指定一周的第一天值作为参数,并避免依赖@@DATEFIRST设置。您可以在需要时使用以下公式来实现这一目标:

(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1

其中@WeekStartDay是系统要在一周中的第一天(从1到7,这意味着从星期一到星期日)。

我将其包装到下面的函数中,因此我们可以轻松地重用它:

CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
    --Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
    RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1 
END

用法示例: GetDayInWeek('2019-02-04 00:00:00', 1)

它等效于以下内容(但与DATEFIRST设置无关):

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')

答案 3 :(得分:0)

一种可怕的情况。...假设您正在使用共享服务器,并且应用程序可能会根据负载而移动到其他服务器,并且由于某种原因,一台服务器已为另一个应用程序设置了不同的firstDate。...在表函数中返回工作日(即无法在此函数中设置firstdate)。这将始终保证星期一为第一天。

CREATE FUNCTION fnGetMondayWD(@WD INT)
RETURNS INT
AS
     BEGIN

         /* think of 1 to 7 as a clock that can rotate forwards or backwards */

         DECLARE @OFFSET INT, @calc INT;
         SET @offset = @@DATEFIRST + @WD - 1;--Monday DateFirst
         SET @calc = IIF(@offset > 7, @offset - 7, @offset); -- could be @offset % 7 (less readable more efficient)
         RETURN @calc;
     END;

go

-- Test Cases


SET datefirst 7
select dbo.fnGetMondayWD(2) Mon,
     dbo.fnGetMondayWD(3)Tue, 
     dbo.fnGetMondayWD(4)Wed, 
     dbo.fnGetMondayWD(5)Thur, 
     dbo.fnGetMondayWD(6)Fri, 
     dbo.fnGetMondayWD(7)Sat, 
     dbo.fnGetMondayWD(1)Sun


SET datefirst 6
select dbo.fnGetMondayWD(3) Mon,
     dbo.fnGetMondayWD(4)Tue, 
     dbo.fnGetMondayWD(5)Wed, 
     dbo.fnGetMondayWD(6)Thur, 
     dbo.fnGetMondayWD(7)Fri, 
     dbo.fnGetMondayWD(1)Sat, 
     dbo.fnGetMondayWD(2)Sun

SET datefirst 5
select dbo.fnGetMondayWD(4) Mon,
     dbo.fnGetMondayWD(5)Tue, 
     dbo.fnGetMondayWD(6)Wed, 
     dbo.fnGetMondayWD(7)Thur, 
     dbo.fnGetMondayWD(1)Fri, 
     dbo.fnGetMondayWD(2)Sat, 
     dbo.fnGetMondayWD(3)Sun

SET datefirst 1
select dbo.fnGetMondayWD(1) Mon,
     dbo.fnGetMondayWD(2)Tue, 
     dbo.fnGetMondayWD(3)Wed, 
     dbo.fnGetMondayWD(4)Thur, 
     dbo.fnGetMondayWD(5)Fri, 
     dbo.fnGetMondayWD(6)Sat, 
     dbo.fnGetMondayWD(7)Sun