このタイプのコードでは、
AND Orders.ShipDate >= DATEADD(Day, Datediff(Day,0, GetDate() -6), 0)
6 日前から今日までの日付のレコードを取得することになっていました。7日前から昨日までのレコードを取得するにはどうすればよいですか?
-6
に変更する-7
と 7 日前のレコードが取得されることはわかっていますが、どの変数が日付範囲の最後なので、に変更でき-1
ますか?
このタイプのコードでは、
AND Orders.ShipDate >= DATEADD(Day, Datediff(Day,0, GetDate() -6), 0)
6 日前から今日までの日付のレコードを取得することになっていました。7日前から昨日までのレコードを取得するにはどうすればよいですか?
-6
に変更する-7
と 7 日前のレコードが取得されることはわかっていますが、どの変数が日付範囲の最後なので、に変更でき-1
ますか?
期間ではありません。
あなたが持っている条件は、実際にはただ1つの条件です:より大きい。より大きいの右側は6日前であるため、条件は6日前の日付より後の日付と一致します。言い換えれば、それは今日にとどまりません。明日、来週、来年も含まれます。
AND ( Orders.ShipDate >= DATEADD(Day, Datediff(Day,0, GetDate() -7), 0)
AND Orders.ShipDate < DATEADD(Day, Datediff(Day,0, GetDate()), 0) )
それがあなたが本当に望んでいることです。これは、7日前の日の真夜中より後の日付と今日の真夜中より前の日付(昨日の任意の時刻)に一致します。
「日付範囲の終わり」はクエリにありません。
コードを次のように変更します。
AND (Orders.ShipDate BETWEEN DATEADD(Day, -1, GetDate()) AND DATEADD(Day, -7, GetDate()))
これも機能するはずであり、不要な 0 日を追加する必要がなくなります。
select *,DATEDIFF(Day, orders.ShipDate, GETDATE()) AS DAYS_SINCE_TODAY
from Orders
where DATEDIFF(Day, orders.ShipDate, GETDATE()) >= 1 AND --This many days since today
DATEDIFF(Day, orders.ShipDate, GETDATE()) <= 7 --Going back this many days
私は BETWEEN 関数が好きです。これは、あなたが使用している SQL とは異なるフレーバーの SQL かもしれませんが、私はこれを使用しています。
BETWEEN dateadd(second, 0, dateadd(dd,datediff(dd,7,getdate()),0)) AND dateadd(second,-1, dateadd(dd,datediff(dd,0,getdate()),0))