Как установить понедельник в качестве первого дня недели в SQL Server

Я запускаю SQL Server 2008 на машине с региональными настройками, которые имеют понедельник в качестве первого дня недели. Если я создам вычисляемый столбец в таблице, чтобы вычислить день недели для поля даты, тогда я получаю 2 для даты понедельника вместо 1.

Есть ли какое-то свойство для таблицы или базы данных или сервера, которые мне нужно установить?

Ответ 1

Первый день недели основан на ваших языковых настройках сервера. Значение по умолчанию для us_english - 7 (воскресенье)

Вы можете найти текущий первый день недели, используя SELECT @@DATEFIRST


Однако для этого вы можете использовать DATEFIRST. Просто поставьте его в верхней части вашего запроса

SET DATEFIRST 1; это устанавливает понедельник в первый день недели для текущего соединения.

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

Ответ 2

Просто установите запрос

SET DATEFIRST 1;

Значение Первый день недели 1 понедельник 2 Вторник 3 Среда 4 четверг 5 Пятница 6 Суббота  7 (по умолчанию, США) воскресенье

Ответ 3

Вы можете использовать DATEPART(dw, GETDATE()) но помните, что результат будет зависеть от значения параметра @@DATEFIRST сервера SQL, который является значением первого дня недели (в Европе значение по умолчанию 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')

Ответ 4

Ужасная ситуация.... Допустим, вы используете общий сервер, и приложения могут перемещаться на другие серверы в зависимости от нагрузки, и по какой-то причине один сервер был настроен с другой 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