以下のようなデータの表があり、今日までのすべての一時停止時間の合計を計算する必要があります。列には任意の日付を含めることができるため、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 年 7 月 1 日 11:00:00) および 2013 年 5 月 1 日 -> オープン (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 を効率的にしたいと考えています。