📜  sql 列出两个日期之间的日期 - SQL (1)

📅  最后修改于: 2023-12-03 15:05:18.507000             🧑  作者: Mango

SQL 列出两个日期之间的日期

在 SQL 中,我们可以使用一些函数和运算符来计算两个日期之间的日期。以下是几种常见的方法。

使用日期函数 DATEDIFF 和 DATEADD

DATEDIFF 函数可以计算两个日期之间的天数,因此我们可以结合 DATEADD 函数来获取两个日期之间的所有日期。

下面是一个例子,假设我们需要列出 2022 年 1 月 1 日和 2022 年 1 月 10 日之间的所有日期:

WITH dates AS (
  SELECT CAST('2022-01-01' AS DATE) AS date_val
  UNION ALL
  SELECT DATEADD(day, 1, date_val) AS date_val
  FROM dates
  WHERE date_val < '2022-01-10'
)
SELECT date_val
FROM dates;

代码解释:

  • CTE (Common Table Expression) dates 定义了一个名为 date_val 的列,初始值为 2022 年 1 月 1 日。
  • 在 CTE 中使用了递归查询,每次迭代加 1 天,直到 date_val 到达 2022 年 1 月 10 日。
  • 最后在 dates CTE 中查询 date_val 列的所有值。

得到的结果如下:

date_val   
----------
2022-01-01
2022-01-02
2022-01-03
2022-01-04
2022-01-05
2022-01-06
2022-01-07
2022-01-08
2022-01-09
使用生成表

另一种获取日期区间的方法是生成一个包含时间序列的表。

下面是一个例子,假设我们需要列出 2022 年 1 月 1 日和 2022 年 1 月 10 日之间的所有日期:

SELECT DATEADD(day, number, CAST('2022-01-01' AS DATE)) AS date_val
FROM master..spt_values
WHERE type = 'P'
  AND dateadd(day, number, CAST('2022-01-01' AS DATE)) < '2022-01-10';

代码解释:

  • 使用一个系统表 master..spt_values,它是一个包含整数序列的表。
  • WHERE 子句中筛选出大于等于 0 的整数序列,即 type = 'P'
  • 使用 DATEADD 函数计算每个整数对应的日期。
  • WHERE 子句中筛选出小于 2022 年 1 月 10 日的日期。

得到的结果和上面的方法相同:

date_val   
----------
2022-01-01
2022-01-02
2022-01-03
2022-01-04
2022-01-05
2022-01-06
2022-01-07
2022-01-08
2022-01-09
总结

两个方法都可以用来获取日期区间,它们的实现方式有所不同,开发者可以根据实际情况来选择使用哪种方法,并在性能和易用性之间做出权衡。