2017-04-17 10 views
0

私はこれを検索していますが、指定された日付の回答のみを取得しています。当月の特定の日と前月の間を選択してください

私が直面しています問題は、次のとおりです。

戻る前の月の20日と今月の20日の間のすべてのデータ。

select name, data, activity from Table 
where (year(data) = year(getdate()) and month(data) = month(getdate())-1 and day(data) >= 20) and (year(data) = year(getdate()) and month(data) = month(getdate()) and day(data) <= 20) 

select name, data, activity from Table 
where year(data) = year(getdate()) and month(data) >= month(getdate())-1 and day(data) >= 20 

この最後のものは動作しますが、当月の結果は返されません。

私はいくつかのwhere節を試しましたが、日付を指定するだけでうまくいくことがわかりました。これを動的に行う方法はありますか?

おかげ

答えて

0

あなたはヶ月を比較するeomonth()を使用することができます。

select t.* 
from t 
where (day(data) >= 20 and eomonth(data) = eomonth(dateadd(month, -1, getdate()))) or 
     (day(data) < 20 and eomonth(data) = emonth(getdate())); 

あなたは、SQL Server 2008でこれを行うことができますが、日付の計算は少し厄介です。一つの方法は、21日引くと、それは前の月であるかどうかを確認することです。

select t.* 
from t 
where (year(dateadd(day, -21, data)) * 12 + month(dateadd(day, -21, data)) = 
     year(getdate()) * 12 + month(getdate()) - 1 
    ) 
+0

おかげ@Gordonが、それは、同社が唯一2012年に来て、SQL Server 2008とEOMONTHを使用している縫い目2008年にEOMONTHをシミュレートする方法はありますか?ありがとう –

0

ofmonthは2008年に存在しないとして、私は@Gordon正しい答えを翻訳しました:

(day(data) >= 20 and CONVERT(DATE, dateadd(mm, datediff(mm,0, data)+1,-1)) = CONVERT(DATE, dateadd(mm, datediff(mm,0, dateadd(month, -1, getdate()))+1,-1))) or 
    (day(data) < 20 and CONVERT(DATE, dateadd(mm, datediff(mm,0, data)+1,-1)) = CONVERT(DATE, dateadd(mm, datediff(mm,0, current_timestamp)+1,-1))) 

と出来た。

おかげ

関連する問題