2013-02-26 4 views
4

У меня есть простой SQL для вычисления количества недель в моих отчетах по SQLiteSQLite возвращает неверный номер недели на 2013 год?

SELECT STRFTIME('%W', 'date_column') 

Это было правильно на 2009-2012 годы. В 2013 году у меня всегда был неправильный номер недели.

Например

SELECT STRFTIME('%W', '2012-02-28') 

возвращение '09', и это правильно.

SELECT STRFTIME('%W', '2013-02-28') 

возвращение '08', и это неправильно. У нас есть 9-я неделя.

Есть ли что-то в функциях даты SQLite, которые я не понимаю? Или это ошибка SQLite?

ответ

6

ответ CL работает отлично подходит для определения ФП о «правых», что не совсем такой же, как определение ISO. Номера недель ИСО всегда находятся в диапазоне 1-53 (без недели 0), а последние 3 дня в году могут попасть в Неделю 1 следующего года, так же как первые 3 дня могут попасть на Неделю 52 или 53 предшествующий год. Для того, чтобы эти угловые случаи во внимание, что вам нужно сделать что-то вроде:

SELECT 
    (strftime('%j', date(MyDate, '-3 days', 'weekday 4')) - 1)/7 + 1 AS ISOWeekNumber 
FROM MyTable; 

В качестве примечания, SQLite's Date and Time документации делает ссылку на страницу POSIX strftime человека, который определяет %W модификатора как: "номер недели (понедельник в качестве первого дня недели) в виде десятичного числа [00,53]. Все дни в новом году, предшествующем первому понедельнику, считаются на неделе 0. «

+0

Спасибо за ответ. Я проверю решение. – WebDucer

+0

Это действительно лучше, чем предлагаемое решение? Испытано? – l33t

+1

@ l33t: Это «лучше», если вы хотите рассчитать ** номера номеров ** **. Это и оригинальное решение иногда различаются в одном или нескольких последних 3 и первых 3 днях года. Например, номер недели ISO 01/01/2011 равен 52, исходное решение вычисляет его как 0. Или неделя ИСО от 12/31/2012 равна 1, исходное решение выдает 53. И да, я тоже тестировал его в течение 50 лет, а вывод аналогичен выходу метода 'datetime.isocalendar()' python. – srdan

3

Чтобы преобразовать из определения недели бездокументации SQLite (первая неделя - неделя с первым понедельником в этом году или неделя с 7 января в нем) до определения недели ISO (первая неделя - неделя с первым в этом году вторником в нем или неделю с 4 января в нем), мы позволяем SQLite вычислять неделю 4 января. Если это не один, мы должны увеличить номер недели:

SELECT strftime('%W', MyDate) 
     + (1 - strftime('%W', strftime('%Y', MyDate) || '-01-04')) 
FROM MyTable 
+0

Спасибо за помощь. Есть ли общая формула sql для получения нужной цифры года? – WebDucer

+0

Определите «право». –

+0

Я имею в виду следующее справа. Неделя № 0: день относится к последней неделе года до Неделя № 1: день относится к первой неделе года Первая неделя (ИСО) начинается с недели, в которую входит четвертое января к. например: 01.01.2013 => первая неделя, 01.01.2012 => пятьдесят второй недели (0), 02.01.2012 => первая неделя, 01.01.2010 => пятьдесят третья неделя (0), 04.01.2010 => 1-я неделя – WebDucer

 Смежные вопросы

  • Нет связанных вопросов^_^