- ベストアンサー
SQLで日付の指定
INT型の日付(20070621)をWHEREでその月の1日から末日までを指定したいのですが、どのようなSQLを書けばよいのでしょうか?ちなみに下記に私が書いたものを記載しますが、もっと効率のよい方法はないのでしょうか? 1日を指定 day > { fn CONCAT({ fn CONCAT(LEFT(LEFT({ fn CURDATE()}, 7), 4), RIGHT(LEFT({ fn CURDATE() }, 7), 2)) }, '01') }) 末日の指定 day < { fn CONCAT({ fn CONCAT(RIGHT(LEFT(DATEADD(d,-1,{ fn CONCAT({ fn CONCAT(RIGHT(LEFT(DATEADD(m, 1, { fn CURDATE() }), 10), 4), LEFT(LEFT(DATEADD(m, 1, { fn CURDATE() }), 10), 2)) }, '01') }), 10), 4), LEFT(LEFT(DATEADD(d, - 1,{ fn CONCAT({ fn CONCAT(RIGHT(LEFT(DATEADD(m, 1, { fn CURDATE() }), 10),4), LEFT(LEFT(DATEADD(m, 1, { fn CURDATE() }), 10), 2)) }, '01') }), 10), 2)) }, RIGHT(LEFT(LEFT(DATEADD(d, - 1, { fn CONCAT({ fn CONCAT(RIGHT(LEFT(DATEADD(m, 1, { fn CURDATE() }), 10),4), LEFT(LEFT(DATEADD(m, 1, { fn CURDATE() }), 10), 2)) }, '01') }), 10), 5),
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1日の日付はcastoffさんのやり方で取得できます。 Cast(LEFT('20070621',1,6) + '01' as DateTime) 翌月の1日は上記をDateAdd関数で1月進めることで取得できます。 DateAdd(m,1,Cast(LEFT('20070621',1,6) + '01' as DateTime)) where句には day >= 当月の1日 and day < 翌月の1日 と記述すると当月分が指定できます。
その他の回答 (2)
- castoff
- ベストアンサー率15% (7/46)
1日 Cast(LEFT('20070621',1,6) + '01' as DateTime) ※DDを01へ 末日 DateAdd(day,-1,LEFT(DateAdd(month,1,Cast('20070621' as DateTime)),1,6) + '01')) ※翌月の1日を求めたあと、前日を求める でいいですか?
- alphion
- ベストアンサー率19% (27/136)
単純に、INT型の日付(20070621)を100で割った値で比較すればよいのでは? 20070621/100=>200706 比較したい値が、この値と等しければ、同月内とか出来そうな気が…
お礼
回答ありがとうございます。その方法だと月が変わるごとにWHEREの中を変えないとだめですよね?年月を指定する値を自動で出てくるようにしたいんですが
お礼
回答ありがとうございます。 回答を参考に末日指定を DATEADD(day, - 1, DATEADD(month, 1, CAST(LEFT ({ fn CURDATE() }, 7) + '-01' AS datetime))) というようにしました。結果は2007/06/30というようになりましたが、これをINT型の「20070630」にしたい場合は上記の式をどのようにすればよいのでしょうか?