読者です 読者をやめる 読者になる 読者になる

checkpoint

自分用のIT技術系ノートです。古い情報や間違っている情報もあるので注意。

datetime型から時刻を取り去るいくつかの方法

SQL Serverでdatetimeから時刻を除去したいときってありますよね。
「本日0時時点のdatetime型データが必要!」というような場合、どのような方法が考えられるでしょうか。

SQL Server 2008の場合

SQL Server 2008では「date型」「time型」という新しいデータ型が用意されています。
従って、時刻を除去したい場合は単純にdate型に変換すればよろしい。

CONVERT(date, GETDATE())

SQL Server 2000、2005の場合

これらのバージョンにはdate型は無いので、一旦文字列に変換してからdatetimeに再変換するのがセオリー。

CONVERT(datetime, CONVERT(char(8), GETDATE(), 112))


が、世の中には私のようにどうしてもdatetimeを文字列に変換したくない!(理由は無いけど)気持ち悪い!という人も居ると思いますので、datetime型のまま時刻を取り去る方法も考えてみました。

DECLARE @today AS datetime
SET @today = GETDATE()
SET @today = DATEADD(hour, DATEPART(hour, @today)*-1, @today)
SET @today = DATEADD(minute, DATEPART(minute, @today)*-1, @today)
SET @today = DATEADD(second, DATEPART(second, @today)*-1, @today)
SET @today = DATEADD(millisecond, DATEPART(millisecond, @today)*-1, @today)
SELECT @today

まあ、単純に時刻を引いて0時にしているだけですが、これならdatetime型のまま時刻を取り去れます。
上の例では段階を踏んでいますが、もちろん一行で書くこともできます。
ワケわからなくなるからお勧めしませんけど。
あと、ミリ秒を引くのを忘れると中途半端な時刻になっちゃうので注意。


あと、文字列に変換したくないけど数値に変換するのは許せるという人は以下のような手段も使えます。

DECLARE @today AS datetime
SET @today = GETDATE()
DECLARE @tmp AS decimal(19, 12)
SET @tmp = CONVERT(decimal(19, 12), @today)
SET @today = CONVERT(datetime, ROUND(@tmp, 0, 1))
SELECT @today

datetime型は実数に変換すると、整数部が日付(最大7桁)、小数部が時刻(最大12桁)になります。
なので、実数から少数以下を切り捨ててからもう一度datetimeに変換すれば大丈夫です。
ROUND関数のオプションを間違えて四捨五入しないように注意。