Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


--年--月--日

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


2009年12月28日

月末・月初

ある日付の月末を求めます。

ちなみに、なぜこんなことを書いたかと言いますと、
SQL Server2005には、月末を求める関数がない為です。

ということで、考えてみました。

例1)

-- ある日付(yyyy/mm/dd)の月末を求める場合の考え方
-- ①対象となる日付
select getdate()
-- ②月を翌月にする
select dateadd(month, 1, getdate())
-- ③翌月の1日
select left(convert(varchar,dateadd(month, 1, getdate()), 111), 8) + '01'

-- ④月末を求める式(①~③をまとめる)
select dateadd(day, -1, convert(datetime, left(convert(varchar, dateadd(month,1 , getdate()), 111), 8) + '01'))

例2)

-- あるテーブルに年、月、日がそれぞれ別の項目として値が登録されている場合の月末
declare @YR smallint
declare @MT smallint
declare @DT smallint

-- DBから取得できる値
set @YR = 2009
set @MT = 12
set @DT = 24

-- ひとつずつ組み立ててみます
-- 例1)同様、翌月の月初を求めるので「@DT」は使いません。

-- 2009/12/24ではなく2009/12/01を組み立てる
select convert(datetime, convert(varchar, @YR) + '/' + convert(varchar, @MT) + '/01', 111)
-- 翌月の月初、すなわち元旦
select dateadd(month, 1 ,convert(datetime, convert(varchar, @YR) + '/' + convert(varchar, @MT) + '/01', 111))
-- もちろん、元旦の前日は大晦日
select dateadd(day, -1, dateadd(month, 1 ,convert(datetime, convert(varchar, @YR) + '/' + convert(varchar, @MT) + '/01', 111)))

上記の例2)では各項目のデータ型が数値ということもあり、
少々長ったらしい書き方にはなっていますが、理想はもっとスマートに書きたいものです。
(ブログ上、改行されてしまいました・・・)

月の初めは必ず【1日】ですが、文字列連結でわざわざ'01'と
指定しなければいけないのが、一番残念です・・・

[ posted by T.K. ]

この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/450-b1aeb6bc
この記事にトラックバックする(FC2ブログユーザー)











上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。