Как установить понедельник в качестве первого дня недели в 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