2012-02-28 1 views
4

を使用して、現在の月の最後の月曜日の取得私は、これはかなり一般的な質問です知っているが、日付はT-SQLを使用した月の前月曜日であれば誰でも確認する良い方法を知っているん。ストアドプロシージャでデータを返すかどうかを判断するためにストアドプロシージャで使用する必要があります。は、T-SQL

乾杯!

答えて

5

次の選択では、現在の日付が月の最後の月曜日の場合は1、それ以外の場合は0が返されます。

select 
case 
when datepart(dw, GETDATE()) = 2 and DATEPART(month, DATEADD(day, 7, GETDATE())) <> DATEPART(month, GETDATE()) 
then 1 
else 0 
end 

datepart(dw, GETDATE())曜日を返します。 2番目の部分は現在の日付に7日を追加し、7日以内に月が変更されたことを確認します(そうでない場合は、最後の月曜日ではありません)。

変更GETDATE()のを確認したい任意の日付に。

EDIT:

あなたは、一般的な機能にそれを作る、あなたが好きな任意の日付でそれを使用することができます。

CREATE FUNCTION 
IsLastMondayOfMonth(@dateToCheck datetime) 
RETURNS bit 
AS 
BEGIN 
DECLARE 
@result bit 

SELECT @result = 
    CASE 
     WHEN datepart(dw, @dateToCheck) = 2 AND DATEPART(month, DATEADD(day, 7, @dateToCheck)) <> DATEPART(month, @dateToCheck) 
    THEN 1 
ELSE 0 
END 
RETURN @result 
END 
+0

これは完全に動作します、ありがとうございます。 select文が0を返す場合、このデータは月の最後の月曜日にのみ必要であり、他の月曜日には必要でないため、データは返されません。 –

+1

+1これはdatefirstに依存することにも注意してください7 –

2

たぶん、このような何か:

DECLARE @YourDate DATETIME='2012-02-25' 
SELECT 
    CASE 
     WHEN @YourDate = DATEADD(wk, DATEDIFF(wk,0,DATEADD(month,DATEDIFF(MONTH,0,@YourDate),30)),0) 
     THEN 1 
     ELSE 0 
    END 
+0

本当に良い解決策と私は解決策の選択に同意しません。より複雑に読むことはできますが、クエリは高速で、@@ datefirstに依存しません。私の+1 –

0

この意志firstdateに関係なく、その月の最後の月曜日である日付を選択します。データベース設定に依存する関数を作ることは、実際には良いことではありません。

select d 
from (select '2012-02-20' d union all select '2012-02-27' union all select '2012-02-28') a 
where datepart(day, dateadd(day, 7 ,d)) < 8 and datediff(day, 0, d) %7 = 0 
0

すでに別の答えを受け入れてきたが、(私の意見では)さらに簡単な解決策はIsLastMondayOfMonthまたは類似のものと呼ばれる列を持つcalendar tableを使用することです。カレンダーテーブルは、コードよりもはるかにクリーンであるだけでなく、例外が発生したときにも、関数よりも保守が容易になる傾向があります(「今年は珍しい祝日のために1日後に月末処理が必要です。それをするためにシステムを修正することはできますか? ")あなたのコードに厄介なロジックを追加するのではなく、テーブルを更新してそれを処理するだけです。