- ベストアンサー
実際に存在する日付の取得
SQLServer2000で関数などを使用して 指定した年月に実際に存在する日付の一覧を返す クエリなどが作成できないものかと考えています。 例:200604の場合01~30という値を返す 何かよい方法がありましたらよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
カレンダーっぽいレコードセットを返すストアドです。 「□」(全角の四角)をTABに変換して、使用してください。 VBなどからの利用であれば、 http://okwave.jp/kotaeru.php3?q=1648176 http://okwave.jp/kotaeru.php3?q=1680532 を参考にしてください。 CREATE PROCEDURE PROC_GET_MONTH_TABLE( --ALTER PROCEDURE PROC_GET_MONTH_TABLE( □@年□AS VARCHAR(4), □@月□AS VARCHAR(2) ) AS BEGIN □--結果出力用のテーブル □DECLARE @TBL□TABLE □( □□日□INTEGER, □□月□INTEGER, □□火□INTEGER, □□水□INTEGER, □□木□INTEGER, □□金□INTEGER, □□土□INTEGER □) □DECLARE @DATE□□DATETIME □DECLARE @INT_月□□INTEGER □DECLARE @INT_カウンタ□INTEGER □--//カウンタの初期化 □SET @INT_カウンタ = 0 □--//日付を求める □SET @DATE = CONVERT(DATETIME, @年 + '/' + @月 + '/01' ) □--//当月を求める □SET @INT_月 = DATEPART(MONTH, @DATE) □--月が替わるまで、処理を継続する □WHILE (DATEPART(MONTH, DATEADD(DAY, @INT_カウンタ, @DATE)) = @INT_月) □BEGIN □□DECLARE @DATE_ワーク□DATETIME □□DECLARE @INT_日□□INTEGER □□DECLARE @INT_曜日ID□INTEGER □□DECLARE @INT_日曜□□INTEGER □□DECLARE @INT_月曜□□INTEGER □□DECLARE @INT_火曜□□INTEGER □□DECLARE @INT_水曜□□INTEGER □□DECLARE @INT_木曜□□INTEGER □□DECLARE @INT_金曜□□INTEGER □□DECLARE @INT_土曜□□INTEGER □□ □□--//カウンタの分だけ、日付を加算 □□SET @DATE_ワーク = DATEADD(DAY, @INT_カウンタ, @DATE) □□--//曜日IDを求める □□SET @INT_曜日ID = DATEPART(WEEKDAY, @DATE_ワーク) □□--//日付を求める □□SET @INT_日 = DATEPART(DAY, @DATE_ワーク) □□--//該当する曜日変数に、日付を格納 □□IF @INT_曜日ID = 1□SET @INT_日曜 =@INT_日 □□IF @INT_曜日ID = 2□SET @INT_月曜 =@INT_日 □□IF @INT_曜日ID = 3□SET @INT_火曜 =@INT_日 □□IF @INT_曜日ID = 4□SET @INT_水曜 =@INT_日 □□IF @INT_曜日ID = 5□SET @INT_木曜 =@INT_日 □□IF @INT_曜日ID = 6□SET @INT_金曜 =@INT_日 □□IF @INT_曜日ID = 7□SET @INT_土曜 =@INT_日 □□--//カウンタを進める □□SET @INT_カウンタ = @INT_カウンタ + 1 □□--[土曜日]または[月替わり]に、週レコードを挿入 □□IF (@INT_曜日ID = 7) OR (DATEPART(MONTH,DATEADD(DAY,@INT_カウンタ,@DATE)) <> @INT_月) □□BEGIN □□□INSERT @TBL □□□SELECT □□□□@INT_日曜 □□□□,@INT_月曜 □□□□,@INT_火曜 □□□□,@INT_水曜 □□□□,@INT_木曜 □□□□,@INT_金曜 □□□□,@INT_土曜 □□□SET @INT_日曜 = NULL □□□SET @INT_月曜 = NULL □□□SET @INT_火曜 = NULL □□□SET @INT_水曜 = NULL □□□SET @INT_木曜 = NULL □□□SET @INT_金曜 = NULL □□□SET @INT_土曜 = NULL □□END □END □--結果の出力 □SELECT *FROM @TBL END
その他の回答 (1)
- NOBNNN
- ベストアンサー率50% (93/186)
MSDE または SQl SERVER 7.0以上であれば DATEADD 関数で簡単に求めることができます。 >>例:200604の場合01~30という値を返す ということですが 詰まるとこ月末日が求められればOK なわけですよね? 例: 2006年4月の末尾を求める ---------------------------------------- Create Procedure 月末日計算 @P計算年月 as datetime = '2006/04/01', -- 計算したい年月を設定します。 @O月末日 as INT OUTPUT as declare @WK月末日 as datetime SET @WK月末日 = dateadd(d,-1,Dateadd(m,1,@P計算年月)) SET @O月末日 = day(@WK月末日) return 0 ----------------------------------------- 実際に使う場合は declare @OT結果月末日 as int EXEC 月末日計算 @P計算年月 = '2006/04/01', @OT結果月末日 output @P計算年月の日付部分は必ず 1日を指定してください。 もし、ストアドでなくクエリでというならば Access ではP計算年月にはパラメータクエリで日付を設定してください。 SELECT P計算年月,CAST(dateadd(d,-1,Dateadd(m,1,計算年月)) as Datetime) as 計算年月月末日, cast(day(CAST(dateadd(d,-1,Dateadd(m,1,計算年月)) as Datetime)) as int) as 月末日 もう少し具体的な使用目的などをがわかれば細かく説明できますが 日付のチェックをしたいなら ISDATE 関数でチェックできます。