SQL Server で時間を切り捨てる。
2006年6月8日 コンピュータ コメント (2)【2011年6月2日追記】
「新 SQL Server で時間を切り捨てる」
http://10395.diarynote.jp/201008270101429723
の方がおすすめです。
--------------------------------------------
SQL Server 2000 の datetime型の値に対して、日付だけを取り出すにはどうするか?ときかれた。
ORACLE では TRUNC が使えるのだが、SQL Server 2000 には無い。
昔は文字列に Convert して LEFT で切り取って戻したことがあるが、かっこ悪いので他の方法を考えた。
で、とりあえず、以下のを提案してみた。(後にだめだと判明する。)
しばらくして質問者の機械では日付が翌日になってしまうという苦情が来た。
再度試したら僕の機械でもそうなった。
小数第2位が四捨五入で繰り上がるとそうなる。
そんな時間まで仕事していて良かったよ。。。(ほんとか?)
そういうわけで、もっときちんと調べた結果、
がいいことが判明した。
SQL Server の Datetime型は 300分の1秒単位で保持されており、小数第3位は 0,3,7 のいずれかになる。
そういうわけで、float で OK なことの検証用SQL。
2007-7-31 追記
SQL Server 2008 には Data型とTime型が追加されるらしい。
2009-6-11 追記
SQL Server 2005 日付と時刻関数 (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms186724(SQL.90).aspx
・・・カッコつきのURL を認識してくれない。。。。
SQL Server 2008 日付と時刻のデータ型および関数
http://msdn.microsoft.com/ja-jp/library/ms186724.aspx
2010-4-26 追記
サンプル3つのうち、初めの二つは
2006-6-8 23:59:59.997 と 2006-6-8
となり、
3つ目は
2006-6-9 00:00:00.000 と 2006-6-9
となります。
http://10395.diarynote.jp/201004261843122549/
「新 SQL Server で時間を切り捨てる」
http://10395.diarynote.jp/201008270101429723
の方がおすすめです。
--------------------------------------------
SQL Server 2000 の datetime型の値に対して、日付だけを取り出すにはどうするか?ときかれた。
ORACLE では TRUNC が使えるのだが、SQL Server 2000 には無い。
昔は文字列に Convert して LEFT で切り取って戻したことがあるが、かっこ悪いので他の方法を考えた。
で、とりあえず、以下のを提案してみた。(後にだめだと判明する。)
SELECT CAST( floor(CAST(GETDATE() AS numeric (6,1))) AS DATETIME)
しばらくして質問者の機械では日付が翌日になってしまうという苦情が来た。
再度試したら僕の機械でもそうなった。
小数第2位が四捨五入で繰り上がるとそうなる。
そんな時間まで仕事していて良かったよ。。。(ほんとか?)
そういうわけで、もっときちんと調べた結果、
SELECT CAST( floor(CAST(GETDATE() AS float)) AS DATETIME)
がいいことが判明した。
SQL Server の Datetime型は 300分の1秒単位で保持されており、小数第3位は 0,3,7 のいずれかになる。
そういうわけで、float で OK なことの検証用SQL。
SELECT
CAST(’2006-6-8 23:59:59.997’ AS datetime),
CAST( floor(CAST(CAST(’2006-6-8 23:59:59.997’ AS datetime) AS float)) AS DATETIME)
SELECT
CAST(’2006-6-8 23:59:59.998’ AS datetime),
CAST( floor(CAST(CAST(’2006-6-8 23:59:59.998’ AS datetime) AS float)) AS DATETIME)
SELECT
CAST(’2006-6-8 23:59:59.999’ AS datetime),
CAST( floor(CAST(CAST(’2006-6-8 23:59:59.999’ AS datetime) AS float)) AS DATETIME)
2007-7-31 追記
SQL Server 2008 には Data型とTime型が追加されるらしい。
2009-6-11 追記
SQL Server 2005 日付と時刻関数 (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms186724(SQL.90).aspx
・・・カッコつきのURL を認識してくれない。。。。
SQL Server 2008 日付と時刻のデータ型および関数
http://msdn.microsoft.com/ja-jp/library/ms186724.aspx
2010-4-26 追記
サンプル3つのうち、初めの二つは
2006-6-8 23:59:59.997 と 2006-6-8
となり、
3つ目は
2006-6-9 00:00:00.000 と 2006-6-9
となります。
http://10395.diarynote.jp/201004261843122549/