【问题标题】:SQL Join Statement based on date range基于日期范围的 SQL Join 语句
【发布时间】:2013-08-23 17:25:35
【问题描述】:

这里有新的 SQL 开发人员。我正在为我们的 Asterisk 服务器编写一个通话记录应用程序。在一张表(CDRLogs)中,我有来自电话系统的通话记录(src、dst、calldate、duration)。在另一个表中,我有(员工)我有 empName、empExt、extStartDate extEndDate)。我想根据谁在通话日期使用特定的分机,将两者在 src 和 empExt 上结合在一起。在给定的时间范围内,每个扩展一个用户。

例如,我们在 7 月份有 3 个不同的用户坐在 x100。在员工表中,我记录了每个人开始和结束使用该分机的日期。如何让加入来反映这一点?

提前致谢

【问题讨论】:

  • 您使用的是什么关系型数据库? calldateextStartDateextEndDate 的数据类型是什么?
  • @Declan_K MSSQL 2008。Calldate 是 datetime,extStartDate 和 extEndDate 是 smalldatetime

标签: sql sql-server-2008 join


【解决方案1】:

可能是这样的:

SELECT A.*, B.*
FROM CDRLOGS A
INNER JOIN Employees B
  ON A.SRC = B.EmpExt
  AND A.CallDate between B.extStartDate and coalesce(B.extEndDate,getdate())

请将 * 替换为所需的相关字段 并且可能有更好的方法,因为在 between 上加入似乎可能会导致一些开销,但我目前想不出更好的方法。

【讨论】:

  • 在加入日期字段时要非常小心Between。根据处理从一名员工到另一名员工的过渡的方式,您可能会遇到错误。
  • 非常正确,我假设这些字段是日期时间并且没有任何重叠;也没有任何空隙
  • @xQbert 这在一定程度上对我有用。一个小问题是,如果一个人当前坐在那个分机上(因此延长日期是空的),他们的比赛不会被退回。我该怎么说“如果extenddate =“”然后extenddate =今天”?
  • 使用 coalese 它将采用系列中的第一个非空值。
  • @xQbert 就是这样!我使用了 COALESCE(b.extEndDate,GetDate()) 并且它现在报告正确。谢谢楼主!
猜你喜欢
  • 2020-09-30
  • 2021-10-30
  • 2019-07-15
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多