2016-04-19 10 views
0

私は、このクエリで動く部分が多すぎるかどうかを判断しようとしています。日付が金曜日にある場合、対応する値は次の月曜日からのものであることを確認する必要があります。それ以外の日は、翌日です。私は問題なく動作するように '次の日'の部分を得ることができますが、金曜日から月曜日の作品は失敗します。ちょっと難しいのは、a.Change_DateがDate形式で、b.Load_DateがDateTime形式であることです。SQL where、betweenまたはequal dateとdatetimeの比較

SELECT * 
    FROM a, b 
    where a.account_number = b.account_Number 
    and a.Change_date 
    case when datepart(dw, a.Change_date) = 5 
      then BETWEEN (CAST(DATEADD(dd, -4, b.Load_Date) AS DATE)) AND (CAST(DATEADD(dd, -3, b.Load_Date) AS DATE)) 
     else 
      = CAST(b.Load_Date) AS DATE) and CAST(DATEADD(dd, -1, b.Load_Date) AS DATE) 
    end 
    and a.Account_Number in 
(XXXXX.....) 

これを行う方法についてのご意見は高く評価されます。これは、account_numbersが最後とステートメントに存在するすべての行を返す必要があります。私はこれをあまりにも長く今日見てきましたが、十分な進歩はありませんでした。

+0

else節の後に等号があることにお気づきになりましたか?私はあなたがそれをかっこで置き換えるかもしれないと思う。 –

+0

データ型の違いは実際問題ではありません。あなたはちょうど問題を過ちしています。金曜日のdw値= 6だからdatepart(dw、DATE)= 6のときは日付に3を加えます。それ以外の場合は、日付に1つ追加します。以下の答えを見てください。あなたが1分後に戻ってくるとかなり簡単です。 –

+0

どのDBMSを使用していますか? –

答えて

0

完全なスキーマはわかりませんが、いくつかのローカル変数を使った簡単な例です。

declare @somedate datetime = '2016-04-15 15:17:00.497'--getdate() 
declare @nextDate datetime 

select @nextDate = case when datepart(dw,@somedate)=6 then @somedate+3 else @somedate+1 end 

select @nextDate NextDate