10

SQLite のレポートで週番号を計算するための単純な SQL があります。

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のバグですか?

4

2 に答える 2

12

CLの答えは、OPの「正しい」定義に対してうまく機能しますが、これはISO定義とまったく同じではありません。ISO の週番号は常に 1 ~ 53 の範囲 (0 週ではない) であり、最初の 3 日間が翌年の 52 週または 53 週に分類されるように、年の最後の 3 日間は翌年の第 1 週に分類されます。前年。これらのコーナー ケースを考慮に入れるには、次のようなことを行う必要があります。

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

補足として、SQLite の日付と時刻のドキュメントは、修飾子を次のように定義しているPOSIX strftime man ページにリンクしています。新年の最初の月曜日より前のすべての日は、第 0 週と見なされます。%W

于 2013-03-19T22:38:28.023 に答える
5

SQLiteの文書化されていない週の定義(最初の週はその年の最初の月曜日が含まれる週、または1月7日が含まれる週)からISOの週の定義(最初の週はその年の最初の火曜日が含まれる週、または1月4日の週)、SQLiteにその年の1月4日の週を計算させます。それが1つでない場合は、週数を増やす必要があります。

SELECT strftime('%W', MyDate)
       + (1 - strftime('%W', strftime('%Y', MyDate) || '-01-04'))
FROM MyTable
于 2013-02-26T08:36:29.313 に答える