如何生成两个日期之间的所有日期

How to generate all dates between two dates

如何在 SQLite 中检索“2015-10-02”到“2015-11-02”之间的所有日期? (字符串类型) 结果如下:

'2015-10-03'
'2015-10-04'
'2015-10-05'
...
'2015-11-01'

这是不是关于SELECT * FROM myTable where myDate <= '2015-01-01' AND myDate >= '2015-01-31'的问题。这是 而不是 关于选择字段介于两天之间的所有 现有 记录。我只想检索两个日期之间所有可能的日期值。我想用它们按天查询记录数。

Date             Count
'2015-01-01'      19
'2015-01-02'      10
'2015-01-03'      0
...

如果没有 SQLite 3.8.3 中引入的递归 common table expression,这是不可能的:

WITH RECURSIVE dates(date) AS (
  VALUES('2015-10-03')
  UNION ALL
  SELECT date(date, '+1 day')
  FROM dates
  WHERE date < '2015-11-01'
)
SELECT date FROM dates;

如果您经常需要它,可能值得生成一个 table 来保存您需要的范围内的所有日期。

在 Linux 中使用 Bash 和它的 date 命令,很容易生成日期并用它们填充 table。

假设您有一个“天”table,其中有一个“d”列:

d='2019-01-01'          # start date
end='2021-12-31'        # end date
while ! [[ $d > $end ]]; do
  echo $d
  d=$(date -d "$d + 1 day" +%F)
done \
| sqlite3 $Your_DB '.import /dev/stdin days'

或作为(长)单行:

d='2019-01-01'; end='2021-12-31'; while ! [[ $d > $end ]]; do echo $d; d=$(date -d "$d + 1 day" +%F); done | sqlite3 $Your_DB '.import /dev/stdin days'