如何生成两个日期之间的所有日期
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'
如何在 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'