DATEPART(WEEKDAY, GETDATE())
зависит от опции SET DATEFIRST
, которая также изменяется с помощью SET LANGUAGE
.Язык по умолчанию также можно настроить на уровне сервера, используя sp_configure
.
Например, попробуйте следующее, чтобы увидеть разные результаты:
DECLARE @CurrentDate DATE='2019-06-16'
SET LANGUAGE ENGLISH
SELECT DATEPART(WEEKDAY, @CurrentDate),
DATEADD(DAY, 1 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate),
DATEADD(DAY, 7 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate)
-- returns 1, 2019-06-16, 2019-06-22
SET LANGUAGE BRITISH
SELECT DATEPART(WEEKDAY, @CurrentDate),
DATEADD(DAY, 1 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate),
DATEADD(DAY, 7 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate)
-- returns 7, 2019-06-10, 2019-06-16
Чтобы код работал одинаково, независимо от опции SET DATEFIRST
, вы можете добавить @@DATEFIRST
следующим образом:
DECLARE @CurrentDate DATE='2019-06-16'
SET LANGUAGE ENGLISH
SELECT (@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1,
DATEADD(DAY, 1 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate),
DATEADD(DAY, 7 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate)
-- returns 1, 2019-06-16, 2019-06-22
SET LANGUAGE BRITISH
SELECT (@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1,
DATEADD(DAY, 1 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate),
DATEADD(DAY, 7 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate)
-- returns 1, 2019-06-16, 2019-06-22