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)
另外,请不要使用a
、b
、c
等为您的表起别名。使用实际告诉任何阅读此代码的人所引用的表的内容。
【讨论】:
谢谢你!我以为左连接会自动显示所有匹配的记录。以上是关于SQL:如何显示给定范围内的所有日期?的主要内容,如果未能解决你的问题,请参考以下文章