dポイントプレゼントキャンペーン実施中!

SQLServer2000で関数などを使用して
指定した年月に実際に存在する日付の一覧を返す
クエリなどが作成できないものかと考えています。

例:200604の場合01~30という値を返す

何かよい方法がありましたらよろしくお願いします。

A 回答 (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
    • good
    • 0

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 関数でチェックできます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す