Tei5’s Blog

Tei5 の メモ書き

SQLiteで連続する日付テーブルをつくりたい(再帰SQL)

SQLite で連続する日付をつくりたい。

とある事情で、与える日付のフォーマットは、「YYYY/MM/DD」にしたい


やってることは?

再帰 SQL を使って、連番を作って 日付に直す。

julianday 関数は、日時を与えると、ユリウス日を返す。ユリウス日は、西暦紀元前4713年1月1日正午(グリニッジ時)から数えた通日。単位は日。
julianday 関数の引数は、「YYYY-MM-DD」で与えるので、replace で区切りを置き換えている。

('2020/02/25' を、'2020-02-25' に置換)

その後、strftime関数で 日付を作り直す。

日付の連番は これで、OK!

WITH RECURSIVE
  cnt(x) AS (VALUES(julianday(replace('2020/02/25', '/', '-') ))
  UNION ALL
   SELECT x+1 FROM cnt WHERE x < julianday(replace('2020/03/03', '/', '-') ))
SELECT x,strftime('%Y/%m/%d', x) AS DATE FROM cnt;

結果

2458904.5|2020/02/25
2458905.5|2020/02/26
2458906.5|2020/02/27
2458907.5|2020/02/28
2458908.5|2020/02/29
2458909.5|2020/03/01
2458910.5|2020/03/02
2458911.5|2020/03/03

実際は、左のx のカラムは要らないね。
× の 0.5 は何やねん。と思うけども、julianday関数は 正午が基準 なので、夜の0時は 0.5になる。


おまけ。数字の連番を作るには、

3 ~ 10を出力。

WITH RECURSIVE
  cnt(x) AS (VALUES(3) UNION ALL SELECT x+1 FROM cnt WHERE x < 10)
SELECT x FROM cnt;

結果

3
4
5
6
7
8
9
10

1から、2 つづつ増加させ、 10 個出力 (奇数で1~19)

WITH RECURSIVE
  cnt(x) AS ( SELECT 1  UNION ALL  SELECT x+2 FROM cnt  LIMIT 10 )
SELECT x FROM cnt;

結果

1
3
5
7
9
11
13
15
17
19