簡體   English   中英

在日期的Where子句中使用案例

[英]Using Case in a Where Clause for Dates

我目前有這個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值(這是多余的),我只想使用以下Date Range作為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語句,就像IF saa.Date為NULL然后[使用上面的日期范圍參數]

我將以@AHiggins為答案,但會提高性能和可讀性

-可貼性

-避免cast

- 使用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'
         )
      )
     )     

確保您在日期列上有索引

如果我沒看錯,您應該能夠使用布爾邏輯和幾百萬個括號來做到這一點:

編輯:在@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'
          )
         )
      )
     ) 

你知道

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

與= '09 / 24/2014'相同

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的答案更加有效

嘗試這個

(
        (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')
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM