Datepart Week Sql (53 недели в году)

Я вычисляю неделю для определенной даты в SQL, например, «2016-01-20» (yyyy-mm-dd), но SQL возвращает неделю: 4, и это неправильно, потому что в этом году первая неделя началась «2016-01-04». результат должен быть неделя: 3.

Я думаю, что проблема возникла из-за того, что в 2015 году было 53 недели, какое-нибудь решение? Спасибо и извините за мой плохой английский


person Sebastian Pelaez    schedule 20.01.2016    source источник
comment
Чтобы уточнить ваш вопрос, перечислите следующее: 1) База данных, в которой вы используете функцию datepart (SQL Server или MS Access); 2) конкретный запрос, который вы пишете; 3) Результаты или ошибка, которую вы видите; 4) Результаты, которые вы ожидаете увидеть.   -  person DanK    schedule 20.01.2016
comment
Если это SQL Server, то January 1 of any year defines the starting number for the week datepart, for example: DATEPART (wk, 'Jan 1, xxxx') = 1, where xxxx is any year. -msdn   -  person SQLChao    schedule 20.01.2016
comment
Какую СУБД вы используете: SQL Server, MySQL, Oracle...? Это имеет значение для ответа.   -  person Esoteric Screen Name    schedule 20.01.2016
comment
Предполагая, что SQL Server - возможно, вы ищете параметр datepart ISO_WEEK? Небольшое чтение   -  person Bridge    schedule 20.01.2016
comment
Расчет недели в году очень (если не невероятно) субъективен. Если ваши бизнес-требования не соответствуют требованиям вашей СУБД, вам придется перевернуть собственную логику.   -  person Philip Kelley    schedule 20.01.2016
comment
Согласно вашему вопросу, неделя начинается с понедельника. Если это ваша деловая ситуация, вы можете создать таблицу календаря, включающую такие вещи. У нас есть один в нашем хранилище данных, и поле называется week_beginning.   -  person Dan Bracuk    schedule 20.01.2016
comment
Исходя из вопроса, определение недели OP основано на ISO.   -  person dnoeth    schedule 20.01.2016


Ответы (2)


В tSQL DATEPART() возвращает правильные данные для США и большей части Европы, а также для Великобритании. См. здесь

Однако вы можете использовать SET DATEFIRST для настройки начальной позиции.

person Fuzzy    schedule 20.01.2016
comment
ОП должен использовать ISO_WEEK. И BOL совершенно неверны, недели ISO распространены по всей Европе, а не только в Норвегии и Швеции (и в других частях мира тоже). - person dnoeth; 20.01.2016

Определение ISO 8601 для недели 01 — это неделя с первым четвергом года. Я использую кеш Intersystems, который, по-видимому, тоже не учитывает этого. Поэтому я использовал это, чтобы решить эту проблему.

CASE WHEN 7-datepart(dw,dateadd(dd,1,dateadd(yy,datediff(yy,0,getdate())-1,0))) < 2 
THEN datepart(wk,getdate())-1 ELSE datepart(wk,getdate()) END as WeekNum 
person CoSpringsGuy    schedule 20.01.2016