这是执行此dateQL的TSQL计算的最有效方法

时间:2013-01-07 11:08:17

标签: sql-server performance tsql datetime

我有一个类似下面的数据表,我需要计算到今天所有暂停时间的总和。列中可以包含任何日期,因此PauseStart可以是将来的日期,PauseEnd也可以是将来的日期。空日期(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年1月2日期间暂停了一次,在2013年4月1日至2013年1月21日期间暂停(应将总和记录为4/1 / 2013至7/1/2013 11:00:00)和5/1/2013 - >开放(应在2013年5月1日至2013年7月1日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。

1 个答案:

答案 0 :(得分:2)

我会这样做:

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()