【问题标题】:How to generate all dates between two dates如何生成两个日期之间的所有日期
【发布时间】:2016-01-04 02:28:25
【问题描述】:

如何在 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 date between


【解决方案1】:

如果没有递归 common table expression,这是不可能的,它是在 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;

【讨论】:

  • 这就是我要找的东西。非常感谢
【解决方案2】:

如果您经常需要它,可能值得生成一个表格,其中包含您需要的范围内的所有日期。

在 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2012-07-09
    • 1970-01-01
    • 2013-08-09
    • 2020-05-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多