2017-08-08 180 views
0

我對SQL很新,並且很難弄清楚如何使用if語句我試圖根據今天的日期確定開始日期和結束日期。目前,我的標準設置是這樣的:如果聲明確定開始日期和結束日期

WHERE training.launch_date >= CONVERT(datetime, '2017-08-04') 
AND training.launch_date <= CONVERT(datetime, '2017-08-10') 

我需要做的是自動查詢,所以我需要總是有START_DATE等於過去的週五,結束日期爲即將到來的週四。我搞砸了一點,但似乎無法弄清楚正確的語法。這是我嘗試過的,但當然不是。

WHERE training.launch_date >= (if(select datepart(dw,getdate()) = 6) 
     Select getdate() 
    ELSE (select getdate() - datepart(dw,getdate()))) 

AND training.launch_date <= (if(select datepart(dw,getdate()) = 6) 
     Select getdate() + 6 
    ELSE (select getdate() - datepart(dw,getdate())+6)) 

任何幫助,將不勝感激。

+2

MySQL的<> SQL服務器 –

+0

Case語句是你在找什麼: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql – Leonidas199x

回答

0

不能使用像在查詢IF流控制語句。您只能使用表達式,即CASE WHEN

在使用日期時,您必須記住「日期」可能包含時間分量,因此最好在第二天使用<,而不是在00:00:00時間內預計確切的日期。

您的查詢可以寫成:

SET DATEFIRST 5 

-- Remove hours, minutes etc. 
DECLARE @CurrentDay DATETIME = CONVERT(DATE, GETDATE()) 

SELECT * 
..... 
WHERE training.launch_date >= @CurrentDay + 1 - DATEPART(dw, @CurrentDay) 
    AND training.launch_date < @CurrentDay + 8 - DATEPART(dw, @CurrentDay) 

說明:

SET DATEFIRST - 設置一週的第一天。見MSDN

如果由於某種原因你不想使用SET DATEFIRST,這時你可以手動偏移的一週的開始:

DATEPART(dw, @CurrentDay + 2) 
+0

這樣做。非常感謝! – adidashawn6

0

這裏有一種方法......

declare @date datetime = '20170815' 

SELECT 
    case 
     when datepart(weekday, @date) >5 then 
     DATEADD(DAY, 4, DATEADD(WEEK, DATEDIFF(WEEK, 0, @date), 0)) 
     else DATEADD(DAY, -3, DATEADD(WEEK, DATEDIFF(WEEK, 0, @date), 0)) 
    end 
    ,DATEADD(DAY,(CASE DATEPART(DW,@date) 
        WHEN 5 THEN 7 
        WHEN 6 THEN 6 
        WHEN 7 THEN 5 
        ELSE 5 - DATEPART(DW,@date) END),@date) 

所以,在你的代碼...

WHERE 
    training.launch_date >= case 
           when datepart(weekday, getdate()) >5 then 
           DATEADD(DAY, 4, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) 
           else DATEADD(DAY, -3, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) 
          end 
    AND training.launch_date <=DATEADD(DAY,(CASE DATEPART(DW,getdate()) 
              WHEN 5 THEN 7 
              WHEN 6 THEN 6 
              WHEN 7 THEN 5 
              ELSE 5 - DATEPART(DW,getdate()) END),getdate()) 
相關問題