【问题标题】:Joining a calendar table to find timesheet missing dates加入日历表以查找时间表缺失的日期
【发布时间】:2014-09-05 16:30:48
【问题描述】:

我有一个如下所示的时间表查询:

User    TimesheetStart    TimesheetEnd
Allen   2014-07-01        2014-07-15
Allen   2014-08-01        2014-08-15
Allen   2014-08-16        2014-08-31

我有一个看起来像这样的日历视图。 [日期] 列定义了该月的第一个日期、15 号、16 号和最后一个日期。

我需要一个返回以下内容的查询。我只是无法理解我需要什么 JOIN 。我在日历视图上尝试了 RIGHT JOIN,但不起作用。

User    TimesheetStart    TimesheetEnd    TimesheetPeriodBeginning
Allen   2014-07-01        2014-07-15      2014-07-01
Allen   NULL              NULL            2014-07-16
Allen   2014-08-01        2014-08-15      2014-08-01
Allen   2014-08-16        2014-08-31      2014-08-16
Allen   NULL              NULL            2014-09-01
Allen   NULL              NULL            2014-09-16

NULL 表示缺少时间表条目。

这就是我目前所拥有的:

SELECT ts.Fields (truncated for clarity)
    ,calendar.Fields (truncated for clarity)
FROM [dbo].[timesheet] AS ts
--this join isn't working...
RIGHT JOIN [dbo].[v_Timesheet_Periods] AS calendar
ON ts.StartDate = calendar.[Date]

【问题讨论】:

  • 您有calendar 别名,而在查询中您使用tsPeriods
  • 另外,当您说不起作用时,究竟发生了什么?您是否收到语法错误或错误结果?
  • @Bulat 为了清楚起见,我已经编辑了这个问题。它不适用于每个屏幕截图... RIGHT JOIN 仅返回时间表表中存在的日期,而不是丢失的日期。不知道为什么。
  • 您确定 v_Timesheet_Periods 中有 9 月的日期吗?
  • @Bulat 是的。我有所有日期,可以过滤任何范围。日历延长至 2020 年。

标签: sql sql-server calendar sql-server-2012


【解决方案1】:

看起来您的最终数据在您的联接中重叠。 你需要考虑时间吗? 那么你应该使用 >= 和一个

SELECT ts.Fields (truncated for clarity)
    ,calendar.Fields (truncated for clarity)
FROM [dbo].[timesheet] AS ts
--this join isn't working...
RIGHT OUTER JOIN [dbo].[v_Timesheet_Periods] AS calendar
ON ts.StartDate >= tsPeriods.[Date]
    AND ts.EndDate < tsPeriods.[Date]

【讨论】:

  • 我在屏幕截图中查看了您的 EndDate 字段,为什么它小于您的 StartDate?
  • 我也可以看到您的 where 子句的开头。你是如何加入你的查找表的?如果您将时间表加入查找,然后将 where 子句应用于查找表,则否定外部连接。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多