目前,我需要將正確的資料輸入到臨時表中。我需要比較 3 個日期時間。但是,并非所有值都被填充。
示例 - 假設所有日期都相同
| 資料1 | 日期時間1 | 日期時間2 | 日期時間3 |
|---|---|---|---|
| 第一的 | 2020-08-24 14:00:00.000 | 2020-08-24 14:30:00.000 | 2020-08-24 15:30:00.000 |
| 第二 | 空值 | 2020-08-24 13:00:00.000 | 2020-08-24 14:30:00.000 |
| 第三 | 空值 | 空值 | 2020-08-24 10:00:00.000 |
從示例中,您可以看到列中有一些空值。我需要先獲取DateTime1的值,如果 null 獲取DateTime2的值。如果DateTime2也為空,則獲取DateTime3。
獲得值后,我需要比較它,看看它是否少于 2 小時,然后再將其放入臨時表。
例如,如果當前時間是下午 2 點 = 1400 小時
我要顯示的最終輸出
| 資料1 | 日期時間1 | 日期時間2 | 日期時間3 |
|---|---|---|---|
| 第一的 | 2020-08-24 14:00:00.000 | 2020-08-24 14:30:00.000 | 2020-08-24 15:30:00.000 |
| 第二 | 空值 | 2020-08-24 13:00:00.000 | 2020-08-24 14:30:00.000 |
uj5u.com熱心網友回復:
聽起來您想選擇過去兩個小時內具有日期時間欄位的行。您不能使用類似的函式,COALESCE因為這會阻止使用覆寫列的任何索引。如果您使用例如:
WHERE COALESCE(DateTime1,DateTime2,DateTime3) >DATEADD(HOUR,-2,GETDATE())
服務器將無法使用任何涵蓋日期欄位的索引,并且將被迫掃描整個表以評估函式輸出和過濾條件
一個簡單的WHERE應該可以作業,甚至不需要檢查NULL,因為任何與NULL失敗的比較:
declare @cutoff datetime=DATEADD(HOUR,-2,GETDATE())
SELECT .....
WHERE
DateTime1 > @cutoff
OR DateTime2 > @cutoff
OR DateTime3 > @cutoff
如果您只想比較時間部分,唯一有效的方法是使用型別將時間部分提取到單獨的欄位中time并對其進行索引。用 提取時間部分cast(DateTime1 as time)會阻止使用索引。
通過掃描整個表可以滿足以下條件:
declare @cutoff time=cast(DATEADD(HOUR,-2,GETDATE()) as time);
SELECT ...
WHERE cast(COALESCE(DateTime1,DateTime2,DateTime3) as time) > @cutoff
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/419938.html
標籤:
