2014-09-24 21 views
1

我目前有這WHERE子句,其中包括以下參數。在何處條款中使用案例日期

WHERE 
    Project ID=110 
    AND ((CAST(saa.Date AS DATE) >= '09/24/2014' AND CAST(saa.Date AS DATE) <= '09/24/2014') OR saa.Date IS NULL)) 

這裏最棘手的部分是,saa.Date is NULL部分要拉的所有Null值在所有的時間(這是過度),我只是想用下面的日期範圍Null

(
     (CAST(sa.StartDateTime AS DATE) >= '09/24/2014' AND CAST(sa.StartDateTime AS DATE) <= '09/24/2014') 
     OR 
     (CAST(sa.EndDateTime AS DATE) >= '09/24/2014' AND CAST(sa.EndDateTime AS DATE) <= '09/24/2014') 
) 

所以我試圖找出如何創建一個CASE聲明,將工作,這將是東西一樣,如果saa.Date爲null,則[使用日期範圍以上參數]

回答

2

我基地我的答案在@ AHiggins的,但加入性能可讀性

- sergability

- 避免cast

- using between

WHERE 
    ProjectID=110 AND 
    (
     (
     saa.Date between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
    ) OR 
     (
     saa.Date IS NULL AND 
     (
      sa.StartDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) OR 
     (
      sa.EndDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) 
    ) 
    )  

確保你有我在茨艾倫日期列ndexes

+0

讓我看起來很懶的方式:)我想過了,我真的這麼做了... – AHiggins 2014-09-24 15:46:58

+0

幾個小時前,我收到了一個倒票,因爲沒有提到激發我的答案的情況! :) – Horaciux 2014-09-24 15:53:24

+0

奇怪的是,這隻產生非空值 – StayPuft 2014-09-24 16:15:44

0

試試這個

(
     (CAST(ISNULL(sa.StartDateTime, '09/24/2014') AS DATE) >= '09/24/2014' AND CAST(ISNULL(saa.StartDateTime, '09/24/2014') AS DATE) <= '09/24/2014') 
) 
1

如果我讀它的權利,你應該能夠與布爾邏輯和幾百萬括號來做到這一點:

編輯:注意到在評論上@ horaciux的回答有一個問題,意識到我們實際上需要多一些括號。我借用了借來的代碼,並在下面添加了額外的代碼。

WHERE 
    ProjectID=110 AND 
    (
     (
     saa.Date between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
    ) OR 
     (
     saa.Date IS NULL AND 
     (-- need to wrap the next two conditions in a single set of parentheses 
      (
      sa.StartDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) OR 
      (
      sa.EndDateTime between '09/24/2014 00:00:00.000' AND '09/24/2014 23:59:59.999' 
     ) 
     ) 
    ) 
    ) 
+0

StayPuft,我認爲還有一組缺失的括號:我借用了代碼@horaciux改進並編輯了我的答案。 – AHiggins 2014-09-25 11:51:27

1

你知道

>= '09/24/2014' 
AND <= '09/24/2014' 

相同 = '09 /2014分之24'

where ProjectID=110 
    AND CAST(saa.Date AS DATE) = '09/24/2014' 
    OR (
     saa.Date IS NULL 
     AND 
      ( 
       CAST(sa.StartDateTime AS DATE) = '09/24/2014' 
       OR 
       CAST(sa.EndDateTime AS DATE) = '09/24/2014' 
      )    
    ) 

這比鑄造更高效:

DATEADD(dd, DATEDIFF(dd, 0, COL),0) 

但是Horaciux的答案更加高效

+0

感謝提到。當它來自高聲譽用戶時,感覺很好。 – Horaciux 2014-09-24 15:40:16