2017-12-04 12 views
1

クエリをフィルタリングして、前月の25日から今月の25日までの結果を抽出する必要があります。 SPは現在の月を抽出するために使用しているパラメータとして日付を受け取ります。私はいくつかのキャストを試みましたが、先月が別の年を持つ1月の月を処理する方法を理解できません(また、より効率的な方法)日付のフィルタ後の結果SQL Server

@Date smalldatetime --received as parameter 
select * 
from mytable 
where mytable.mydate between '25/'+cast(MONTH(@date)-1 as varchar(2))+'/'+cast(YEAR(@date) as varchar(4)) and '25/'+cast(MONTH(@date) as varchar(2))+'/'+cast(YEAR(@date) as varchar(4)) 
+0

SQLバージョン?回答は大きく異なる場合があります。つまり、SQL 2012は 'year()'、 'month()'および 'day()'と組み合わせて使用​​することができる 'datefromparts()'を導入したことで、おそらくハッキーな文字列操作よりもはるかに明確なコードを得ることができます別のロケールに分かれています。 –

+0

SQL Serverのアンダースコアはバージョンを意味します。 SQLはISO/ANSOで指定された言語です。現在のISO SQLバージョンはSQL-2016です。 SQLとSQL Serverを混同しないでください。 – jarlh

+0

おっと、それは重要な説明です。ありがとう。 –

答えて

3

私はちょうどになります。

select t.* 
from t 
where mydate >= dateadd(month, -1, datefromparts(year(getdate()), month(getdate()), 25)) and 
     mydate < datefromparts(year(getdate()), month(getdate()), 25) 

私はむしろ、この目的のために日付文字列を構築しようとするよりも、datefromparts()を使用します。

2

キャスティングを行う必要はありません。 SQL Serverの日時関数は非常に汎用性があります。試してみてください:

SELECT * 
FROM  mytable 
WHERE mytable.mydate BETWEEN DATEADD(DAY, 25, DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date) - 1, 0)) AND DATEADD(DAY, 25, DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)) 
関連する問題