Получить первый день недели в SQL Server - PullRequest
85 голосов
/ 24 августа 2011

Я пытаюсь сгруппировать записи по неделям, сохраняя агрегированную дату в качестве первого дня недели.Тем не менее, стандартная техника, которую я использую для округления дат, кажется, не работает должным образом с неделями (хотя она применяется для дней, месяцев, лет, кварталов и любых других временных периодов, к которым я ее применял).SQL:

select "start_of_week" = dateadd(week, datediff(week, 0, getdate()), 0);

Возвращает 2011-08-22 00:00:00.000, то есть понедельник, а не воскресенье.Выбор @@datefirst возвращает 7, который является кодом для воскресенья, поэтому, насколько я знаю, сервер настроен правильно.

Я могу достаточно легко обойти это, изменив приведенный выше код на:

select "start_of_week" = dateadd(week, datediff(week, 0, getdate()), -1);

Но тот факт, что я должен сделать такое исключение, делает меня немного неловким.Кроме того, извиняюсь, если это дублирующий вопрос.Я нашел несколько связанных вопросов, но ни один из них не касался конкретно этого аспекта.

Ответы [ 14 ]

0 голосов
/ 24 сентября 2015

Поскольку юлианская дата 0 является понедельником, просто добавьте количество недель к воскресенью, то есть за день до -1.выберите дату и время (wk, дата (wk, 0, getdate ()), - 1)

0 голосов
/ 02 октября 2012

У меня была похожая проблема.Учитывая дату, я хотел получить дату понедельника этой недели.

Я использовал следующую логику: найдите номер дня в неделе в диапазоне 0-6, затем вычтите его из исходного числа.date.

Я использовал: DATEADD (день, - (DATEPART (день недели,) + 5)% 7,)

Так как DATEPRRT (день недели,) возвращает 1 = Sundaye ... 7 =Суббота, DATEPART (день недели, + 5)% 7 возвращает 0 = понедельник ... 6 = воскресенье.

Вычитание этого количества дней из первоначальной даты дает предыдущий понедельник.Та же техника может быть использована для любого начального дня недели.

0 голосов
/ 05 марта 2012

Может быть, я слишком упрощен здесь, и это может иметь место, но это, кажется, работает для меня.С ним еще не было проблем ...

CAST('1/1/' + CAST(YEAR(GETDATE()) AS VARCHAR(30)) AS DATETIME) + (DATEPART(wk, YOUR_DATE) * 7 - 7) as 'FirstDayOfWeek'
CAST('1/1/' + CAST(YEAR(GETDATE()) AS VARCHAR(30)) AS DATETIME) + (DATEPART(wk, YOUR_DATE) * 7) as 'LastDayOfWeek'
0 голосов
/ 24 августа 2011

У меня нет проблем ни с одним из ответов, приведенных здесь, однако я думаю, что мой намного проще реализовать и понять.Я не запускал никаких тестов производительности на нем, но он должен быть пренебрежимо малым.

Поэтому я получил свой ответ из того факта, что даты хранятся на сервере SQL как целые числа (я говорю только о компоненте даты),Если вы мне не верите, попробуйте этот SELECT CONVERT (INT, GETDATE ()) и наоборот.

Теперь, зная это, вы можете сделать несколько классных математических уравнений.Возможно, вам удастся придумать лучший вариант, но вот мой.

/*
TAKEN FROM http://msdn.microsoft.com/en-us/library/ms181598.aspx
First day of the week is
1 -- Monday
2 -- Tuesday
3 -- Wednesday
4 -- Thursday
5 -- Friday
6 -- Saturday
7 (default, U.S. English) -- Sunday
*/

--Offset is required to compensate for the fact that my @@DATEFIRST setting is 7, the default. 
DECLARE @offSet int, @testDate datetime
SELECT @offSet = 1, @testDate = GETDATE()

SELECT CONVERT(DATETIME, CONVERT(INT, @testDate) - (DATEPART(WEEKDAY, @testDate) - @offSet))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...