1

日付から ISO 標準の週番号 (つまり、週 1 ~ 52/53) を返したいと考えています。組み込み関数 strftime を使用してみましたが、成功しませんでした。

カスタム C やその他の関数を書かなくても、誰でも方法を提案できますか?

4

3 に答える 3

4

これは古い質問であることは知っていますが、最近、同じ問題に対する効率的な解決策を探していました。これが私が思いついたものです。

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 を引く必要があります。

于 2013-03-19T10:04:48.723 に答える
0

具体的に何を試しましたか?
これは私にとってはうまくいきます(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')
于 2012-02-21T19:09:57.410 に答える
0

OK、私は自分の質問に答えることができました。同様のソリューションが必要な人のために、これが私が思いついたものです。私には IT のバックグラウンドがなく、SQL は独学です。

一般的なプロセス

  1. 日付が属する週の木曜日も取得します。
  2. その年の 1 月 4 日の木曜日を取得します。
  3. 1 月 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 を改善できる場合は、フィードバックをいただければ幸いです。

于 2012-02-22T18:54:17.010 に答える