【问题标题】:SQL : How to show all dates between a given range?SQL:如何显示给定范围内的所有日期?
【发布时间】: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 列表驱动)——它们更多的是选择要显示的相关行!

标签: sql-server stored-procedures left-join user-defined-functions


【解决方案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 等为您的表起别名。使用实际告诉任何阅读此代码的人所引用的表的内容。

【讨论】:

  • 谢谢你!我以为左连接会自动显示所有匹配的记录。
猜你喜欢
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多