我在具有区域设置的计算机上运行SQL Server 2008,该区域设置将星期一作为一周的第一天。如果我在一个表中创建一个计算列来计算一个日期字段的星期几,那么我得到2表示星期一而不是1。
我需要设置表或数据库或服务器的某些属性吗?
答案 0 :(得分:23)
一周的第一天基于您的服务器语言设置。 us_english的默认设置为7(星期日)
您可以使用SELECT @@DATEFIRST
但是,您可以使用DATEFIRST
。只需将其放在查询的顶部
SET DATEFIRST 1;
这会将星期一设置为当前连接的一周的第一天。
答案 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