【问题标题】:Is this the most efficient way of doing this TSQL calculation of datediff这是对 datediff 进行 TSQL 计算的最有效方法吗
【发布时间】:2012-12-21 02:32:18
【问题描述】:

我有一个类似于下面的数据表,我需要计算直到今天为止所有暂停时间的总和。列中可以包含任何日期,因此 PauseStart 可以是未来日期,而 PauseEnd 也可以是未来日期。 Null 日期 (20991231) 被视为开放式结束,即未选择暂停的结束日期。

注意:日期为英国日期格式

数据

PauseID RecID   PauseStart              PauseEnd
1022    10      2013-01-04 15:52:04.320 2013-01-21 00:00:00.000
1023    10      2013-01-01 00:00:00.000 2013-01-02 00:00:00.000
1024    10      2013-01-05 00:00:00.000 2099-01-01 00:00:00.000

上面的数据显示,我们在 2013 年 1 月 1 日和 2013 年 2 月 1 日之间暂停,在 2013 年 4 月 1 日和 2013 年 21 月 1 日之间暂停(总和应该记录为 4/1 /2013 至 7/1/2013 11:00:00)和 5/1/2013 -> 开放(应在总和中注册为 5/1/2013 至 7/1/2013 11:00:00)

列未编入索引。

我想出的TSQL是这样的

SELECT 
    SUM (
    CASE 
    WHEN NULLIF(PauseEnd,'20991231') IS NULL THEN
        DATEDIFF(mi, PauseStart, ISNULL(NULLIF(PauseEnd,'20991231'), GetDate()))
    WHEN PauseEnd > GetDate() THEN
        DATEDIFF(mi, PauseStart, GetDate())
    ELSE
        DATEDIFF(mi, PauseStart, ISNULL(NULLIF(PauseEnd,'20991231'), GetDate()))
    END
        ) AS Datedifference
    FROM Pauses
WHERE Pauses.RecID = 10
AND PauseStart < GetDate()

这给了我结果

4021
1440
3533

这似乎是正确的,但我的问题仍然存在,

这是实现此结果的最有效方法吗?

附录,这个表可以开始保存数百万条记录,所以我想让计算总和的 tsql 在第一个实例中有效。

【问题讨论】:

  • 我认为这不会对性能产生任何影响,但是您的案例陈述中的第一行WHEN NULLIF(PauseEnd,'20991231') IS NULL THEN 我认为WHEN PauseEnd = '20991231' THEN 更具可读性。小事,我知道;-)

标签: sql-server performance tsql datetime


【解决方案1】:

我会这样做:

SELECT 
PauseStart,
DATEDIFF(mi, PauseStart, CASE  WHEN PauseEnd > GetDate() THEN GetDate() ELSE PauseEnd END) as Datedifference
FROM Pauses
WHERE Pauses.RecID = 10 AND PauseStart < GetDate()

【讨论】:

  • 有趣,我显然错过了 null (20991231) 总是大于 GetDate() 的事实
  • 不管怎样,在接下来的 86 年里,我希望我们已经超越了 TSQL。
  • 对不起,我没想到它可以为空
  • 日期始终存储为 31/12/2099 00:00:00 如果它是开放式的。 PauseEnd 是必填字段,不能为空
  • 你根本不需要做任何空检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2011-07-12
  • 2011-07-13
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多