2017-12-20 10 views
0

こんにちは私は到着日と出発日が一致する一時テーブルを持っています。到着と出発の間の3日ごとに更新する必要があります。 は、ここに私の出力であるSQLは3日ごとに更新されます

output

私が考えることができる唯一の方法は3の倍数とDATEADDを使用することですが、到着と出発の間の日が数ヶ月または何年もすることができ、私はセットUPDATEが必要3日おきに何日にもかかわらず

UPDATE #Report SET "Service" = CASE 
    WHEN Date = DATEADD(DAY,3,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,6,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,9,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,12,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,15,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,18,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,21,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
... 
etc 
ELSE 'Restricted Service' END 

誰も解決策を考えてもいいですか?

UPDATE #Report 
    SET Service = (CASE WHEN DATEDIFF(day, Arr, Date) % 3 = 0 
         THEN 'Full Service' 
         ELSE 'Restricted Service' 
        END); 

私はmoneyへの変換は、クエリのバージョンでやっている測深することはできません。

答えて

2

私はこのような何かを期待します。

+0

ありがとうオリジナルの到着日は時間を含めても良い方法がある場合は私に知らせてください(つまり:09:00:00)私の "Date"カラムは真夜中に設定されていましたので、Arrをmoneyに変換してからdatetimeに戻って00:00:00.000に戻しました:) – Kate

+0

私よりも良いソリューションです! @Kate。 – Kate

+0

。 。 'date'に変換するだけで時間コンポーネントを削除することができます。 –

0

私が発見した1つの液:

追加ソーステーブルにランク

RANK() OVER (PARTITION BY RoomID ORDER BY Date) AS Ranking 

Divided rank by 3 

UPDATE #x SET Ranking2 = CAST(Ranking AS DECIMAL(20,2))/3 

Update only where this is a whole number 

UPDATE #Report SET "Service" = 
    CASE WHEN FS.Ranking2 = ROUND(FS.Ranking2, 0) THEN 'Full Service' 
    ELSE 'Restricted Service' END 

関連する問題