日付から ISO 標準の週番号 (つまり、週 1 ~ 52/53) を返したいと考えています。組み込み関数 strftime を使用してみましたが、成功しませんでした。
カスタム C やその他の関数を書かなくても、誰でも方法を提案できますか?
これは古い質問であることは知っていますが、最近、同じ問題に対する効率的な解決策を探していました。これが私が思いついたものです。
SELECT
my_date,
(strftime('%j', date(my_date, '-3 days', 'weekday 4')) - 1) / 7 + 1 as iso_week
FROM my_table;
基本的な考え方は、参照する日付 (my_date) の年の木曜日の曜日を 7 で整数除算し、0 から 52 の間の結果を得て、それに 1 を加算するだけで、ISO の週番号を計算することです。また、除算の直前に 1 を引くのは、除算を調整するためだけに行われます。たとえば、第 1 週の木曜日には、1 から 7 までの曜日があり、除算の結果が 0 になるようにします。すべてのケースで、7 で割る前に、年から 1 を引く必要があります。
具体的に何を試しましたか?
これは私にとってはうまくいきます(Python REPLの組み込みSQLiteを使用):
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')
OK、私は自分の質問に答えることができました。同様のソリューションが必要な人のために、これが私が思いついたものです。私には IT のバックグラウンドがなく、SQL は独学です。
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 を改善できる場合は、フィードバックをいただければ幸いです。