ストアドプロシージャに月と年を指定して、その月に発生するすべてのものを返すようにしたいのですが、月によって日数が異なるなどの理由で比較できないため、これを行うにはどうすればよいですか?
これを行うための最良の方法は何ですか?年と月に基づいて比較するように依頼できますか?
ありがとう。
回答:
あなたが探している機能はですMONTH(date)
。おそらく「YEAR」も使用することをお勧めします 。
things
次のような名前のテーブルがあるとしましょう。
id happend_at
-- ----------------
1 2009-01-01 12:08
2 2009-02-01 12:00
3 2009-01-12 09:40
4 2009-01-29 17:55
そして、happened_at
2009/01月(2009年1月)の間にあるすべてのレコードを検索するために実行するとします。SQLクエリは次のようになります。
SELECT id FROM things
WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009
どちらが返されますか:
id
---
1
3
4
ほとんどの応答で提案されているようにMONTH関数とYEAR関数を使用すると、SQLServerが日付列にある可能性のあるインデックスを使用できないという欠点があります。これにより、大きなテーブルのパフォーマンスが低下する可能性があります。
関心のある月の最初の日を表すストアドプロシージャにDATETIME値(@StartDateなど)を渡す傾向があります。
その後、使用することができます
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
月と年を個別のパラメーターとしてストアード・プロシージャーに渡す必要がある場合は、CASTとCONVERTを使用して月の最初の日を表すDATETIMEを生成してから、上記のように続行できます。これを行う場合は、整数の年、月、日の値からDATETIMEを生成する関数を作成することをお勧めします。たとえば、SQLServerブログの次のようになります。
create function Date(@Year int, @Month int, @Day int)
returns datetime
as
begin
return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
end
go
クエリは次のようになります。
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
@EndDate
することで明示的になります。
もう1つのヒントは非常に簡単です。to_char関数を使用することもできます。
月の場合:
to_char(happened_at、 'MM')= 01
to_char(happened_at、 'YYYY')= 2009
to_char(happened_at、 'DD')= 01
to_char関数は、特定の1つのデータベースではなく、SQL言語によってサポートされています。
もっと誰かを助けてくれるといいのですが...
腹筋!
SQL Serverを使用している場合は、DATEPARTを調べてください。
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
DATEPART(mm、[あなたが見ている日付])
その後、通常の整数ロジックを使用できます。年も同じですが、mmの代わりにyyを使用してください。
私はそれが簡単に(例えば、時間的データ型として値を渡すために見つけDATETIME
、次に具体的には、一時的な機能を使用)DATEADD
し、DATEPART
この場合には、月がこの発見に開始日と終了日のペアを、たとえば、期間の開始日と終了日を見つけるために、今月CURRENT_TIMESTAMP
は、タイプのパラメータに置き換えてくださいDATETIME
(1990-01-01の値は完全に任意であることに注意してください)。
SELECT DATEADD(M,
DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP),
'1990-01-01T00:00:00.000'),
DATEADD(M,
DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP),
'1990-01-31T23:59:59.997')
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';
AAAA
あなたが望む年とあなたが望むMM
月はどこですか