SQLite ISO (т.е. европейский стиль) номера недели - PullRequest
1 голос
/ 21 февраля 2012

Я хочу вернуть стандартные номера недели ISO (т.е. недели 1-52 / 53) с даты.Я попытался использовать встроенную функцию strftime, но безуспешно.

Может кто-нибудь предложить способ без необходимости писать пользовательский C или другую функцию.

Ответы [ 3 ]

2 голосов
/ 19 марта 2013

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

SELECT
    my_date,
    (strftime('%j', date(my_date, '-3 days', 'weekday 4')) - 1) / 7 + 1 as iso_week
FROM my_table;

Основная идея состоит в том, чтобы вычислитьНомер недели ISO, просто выполнив целочисленное деление дня года четверга искомой даты (my_date) на 7, получив результат от 0 до 52, а затем добавив к нему 1.И вычитание на 1 непосредственно перед делением происходит только для выравнивания деления: например, четверг недели 1 может иметь день года между 1 и 7, и мы хотим, чтобы результат деления был 0 вво всех случаях, поэтому нам нужно вычесть 1 из числа года, а затем разделить его на 7.

0 голосов
/ 22 февраля 2012

ОК, так что мне удалось ответить на мой собственный вопрос. Для тех, кому может понадобиться подобное решение, это то, что я придумал. Обратите внимание, у меня нет ИТ-опыта, и мой SQL самоучка.

Общий процесс

  1. Получите четверг недели, к которой относится и дата.
  2. Получите 4 января года того четверга.
  3. Получите четверг недели, к которой относится и дата 4 января.
  4. Вычтите Шаг 2 с Шагом 3, разделите на 7 и сложите 1.

Переведено на SQLite ....

SELECT
date,
CASE CAST (strftime('%w', wknumjanfourth) AS INTEGER)
  WHEN 0 THEN ((JULIANDAY(datesThur) - JULIANDAY(strftime("%s", wknumjanfourth) - 259200, 'unixepoch')) / 7) + 1   
  ELSE ((JULIANDAY(datesThur) - JULIANDAY(DATE(strftime("%s", wknumjanfourth) - (86400 * (strftime('%w', wknumjanfourth) - 1)), 'unixepoch'), '+3 day')) / 7) + 1
END AS weeknum
FROM
(
  SELECT
  date,
  datesThur,
  DATE(datesThur,'start of year','+3 day') AS wknumjanfourth
  FROM
  (SELECT 
    date,
    CASE CAST (strftime('%w', date) AS INTEGER)
      WHEN 0 THEN DATE(strftime("%s", date) - 259200, 'unixepoch')
      ELSE DATE(DATE(strftime("%s", date) - (86400 * (strftime('%w', date) - 1)), 'unixepoch'), '+3 day')
      END AS datesThur
   FROM TEST
))

Если кто-нибудь может улучшить этот SQL, я был бы признателен за отзыв.

0 голосов
/ 21 февраля 2012

Что конкретно вы пробовали?
Это работает для меня (используя встроенный SQLite из Python REPL):

import sqlite3
c = sqlite3.connect(':memory:')
c.execute('''create table t (c);''')
c.execute('''insert into t values ('2012-01-01');''')
c.execute('''select c, strftime('%W',c) from t;''').fetchone()
# -> (u'2012-01-01', u'00')
...