SQL:如何显示给定范围内的所有日期?

Posted

技术标签:

【中文标题】SQL:如何显示给定范围内的所有日期?【英文标题】:SQL : How to show all dates between a given range? 【发布时间】:2020-03-30 08:32:43 【问题描述】:

我有一个表值函数,它返回如下内容:

现在,我有一个日期范围作为参数,比如说 '2020-03-01' 和 '2020-04-15' 我还想要添加一列,显示从 '2020-03-01' 到 '2020-04-15' 的所有日期 它应该是这样的:

    Overtime          | Status               | DTR        | DATE_START    |   DATE
    1.  NULL          | NULL                 | NULL       | NULL          | 2020-03-01
    2.  NULL          | NULL                 | NULL       | NULL          | 2020-03-02
    ...
    ...
    ...
    30. 6:32PM-9:32PM | Pending For Approval | NULL       | 2020-03-30    | 2020-03-30
    ...
    ...
    ...

我的代码是这样的,不要介意 95476237

SELECT CAST(a.IndividualDate as date)
FROM DateRange('d', @start, @end) as a 
LEFT JOIN support.dbo.overtimeReport('95476237', @start, @end) as b on CAST(a.IndividualDate as date) = CAST(b.DATE_START as date)

结果,我只得到了这个,

更新:小错误,我忘了提及 SELECT 语句中的其余列。感谢@iamdave

【问题讨论】:

您需要为此使用日历表,然后将日历表与您需要的结果连接起来。见答案here。 如果您需要这方面的进一步帮助,请提供示例数据和预期结果,然后我们将提供帮助... 谢谢@amm,您提供的示例数据是截图。为了让我们能够轻松地为您提供帮助,请避免使用屏幕截图,除非您的预期结果... calendar table 绝对是您想要的。构建其中之一,您可能也会得到答案。 JOIN 与选择要显示的列无关(“哪列”由 SELECT 列表驱动)——它们更多的是选择要显示的相关行! 【参考方案1】:

您只需将所有您要输出的列添加到您的select 语句中。查询的其余部分似乎没问题(忽略从 TVF 中选择并在 join 标准两侧使用 cast 的所有难闻的气味......):

SELECT b.Overtime
      ,b.Status
      ,b.DTR
      ,DATE_STARTCAST(a.IndividualDate as date) AS [Date]
FROM DateRange('d', @start, @end) as a 
LEFT JOIN support.dbo.overtimeReport('95476237', @start, @end) as b
    ON CAST(a.IndividualDate as date) = CAST(b.DATE_START as date)

另外,请不要使用abc 等为您的表起别名。使用实际告诉任何阅读此代码的人所引用的表的内容。

【讨论】:

谢谢你!我以为左连接会自动显示所有匹配的记录。

以上是关于SQL:如何显示给定范围内的所有日期?的主要内容,如果未能解决你的问题,请参考以下文章

在python中生成给定范围内的所有日期

Oracle SQL 返回日期内的所有记录

s-s-rS 未显示日期范围内的所有数据

统计日期范围内的天数

MySQL:选择两个日期范围内的所有数据

如何在 SQL 中显示两个给定日期之间的所有日期