0

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

4

1 に答える 1

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()
于 2013-01-07T11:19:23.940 に答える