目前,我需要獲得正確的資料以輸入臨時表。我需要比較3個資料時間。然而,并不是所有的值都被填滿了。
示例-假設所有的日期都相同
從這個例子中,你可以看到列中有一些空值。我需要首先得到DateTime1的值,如果是空值,就得到DateTime2的值。如果DateTime2也為空,則獲取DateTime3。
在得到這些值之后,我需要進行比較,看看它是否小于2小時,然后再把它放入臨時表中。
示例,如果當前時間是 2pm = 1400Hrs
。我想顯示的最終輸出
| Data1 | DateTime1 | DateTime2DateTime3|||
|---|---|---|---|---|
| 第一次 | 2020-08-24 14:00:00.000 | 2020-08-24 14:30:00.000 | 2020-08-24 15:30:00.000 | |
| 第二名 | ||||
| 第二名 | NULL | NULL | 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 .....
在哪里?
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/qukuanlian/314789.html
標籤:
