Вы можете использовать DATEPART(dw, GETDATE())
, но имейте в виду, что результат будет зависеть от значения параметра SQL Server @@DATEFIRST
, которое соответствует настройке первого дня недели (в Европе по умолчанию значение 7 равно воскресенью).
Если вы хотите изменить первый день недели на другое значение, вы можете использовать SET DATEFIRST
, но это может повлиять на всю сессию запроса, которая вам не нужна.
Альтернативный способ - явно указать значение первого дня недели в качестве параметра и избежать зависимости от настройки @@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 сервера SQL):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')