2012-02-24 4 views
3

Используя синтаксисSQL Server: группа по неделям выходной 1 день

dateadd(week, datediff(week, 0, CURRENT_TIMESTAMP),0) 

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

В простом примере

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),0) 

Я хотел бы ожидать, чтобы вернуться

Jan 23 2012 12:00AM 
Jan 23 2012 12:00AM 
Jan 23 2012 12:00AM 
Jan 30 2012 12:00AM 
Jan 30 2012 12:00AM 

или

Jan 22 2012 12:00AM 
Jan 22 2012 12:00AM 
Jan 29 2012 12:00AM 
Jan 29 2012 12:00AM 
Jan 29 2012 12:00AM 

в зависимости от настроек DATEFIRST Я думаю

однако Ретур нс

Jan 23 2012 12:00AM 
Jan 23 2012 12:00AM 
Jan 30 2012 12:00AM 
Jan 30 2012 12:00AM 
Jan 30 2012 12:00AM 

то есть 29 января в течение недели 30 января не 23 января или 30 января, как и ожидалось.

Мне явно не хватает чего-то, но я не могу представить, что это может быть.

+0

Конечно, точка, хотя, что кажется несовместимым с самим собой –

+0

я прочитал на «установить DATEFIRST» и увидел, что вы уже знал о «первом дне недели», поэтому я удалил свой комментарий. –

ответ

4

Это правильно. не

Независимо от того, что @@DATEFIRST, там всегда одинаковое количество целых недель в период до 1 января 1900 г. Как @@DATEFIRST изменения, она затрагивает как «старт» и «конец» недели.

DATEADD затем просто добавляет 7-й день периода, потому что она игнорирует @@ DATEFIRST

Вы можете заставить его выбора базовой DATEADD

Пример: 01 Jan 1900 является понедельник.

Вы хотите воскресенье? Затем основание до 31 декабря 1899 года

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),-1) 

Вы хотите во вторник? Затем основание до 02 января 1900 года

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),1) 
1

Это должно преобразовать дату в первый день недели для целей группировки

set datefirst 1 
select dateadd(day, -1 * (datepart(weekday, getdate()) - 1), getdate()) 

Обратите внимание, что set datefirst 1 устанавливает первый день недели в понедельник. Вы можете изменить это заявление, чтобы изменить первый день недели в соответствии с вашими ожиданиями (см. http://msdn.microsoft.com/en-us/library/ms181598.aspx)

+0

Я думаю, что это неправильно. 'DATEDIFF()' не видит 'DATEFIRST'value. –

+0

Спасибо Энди, думаю, я надеялся, что есть синтаксис «поймать все» группировки по дням, неделям месяца и т. Д., Но, я думаю, нет. –

+0

@aF. Вот почему я не использую DATEDIFF :-) –