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

20

我该如何在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
...

1
可能是 SQLite 比较日期 的重复问题。 - David Ferenczy Rogožan
这个链接看起来很相关,但我不确定SQL Server和SQLite之间可能存在的方言差异。 - Nathan Tuggy
2个回答

40

如果没有使用SQLite 3.8.3中引入的递归公共表达式,这是不可能实现的:

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;

0
如果您需要经常使用它,生成一个包含所需日期范围内所有日期的表可能是值得的。
在Linux中使用Bash和其date命令,可以轻松生成日期并用它们填充表格。
假设您有一个带有“d”列的“days”表:
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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接