2017-08-08 17 views
0

私はSQLにはかなり慣れていますが、今日の日付に基づいて開始日と終了日を決定しようとしているif文を使用する方法を考え出すのは苦労しています。現在、私の基準は、次のように設定されている:開始日と終了日を決定する文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 Serverの –

+0

Caseステートメントは、あなたが探しているものです。 https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql – Leonidas199x

答えて

0

です。式は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は - 週の最初の曜日を設定します。何らかの理由であなたがSET DATEFIRSTを使用したくない場合は、手動で週の開始を相殺することができ、MSDN

を参照してください:

DATEPART(dw, @CurrentDay + 2) 
+0

それはそれをしました。どうもありがとうございます! – adidashawn6

0

は、ここでは、あなたのクエリでIFなどのフロー制御ステートメントを使用することはできません一つの方法...

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()) 
関連する問題