SQL Server 2008では、できれば2008の既存の関数を使用して、datetime列を最も近い時間と最も近い分に丸めたいと考えています。
この列の値の2007-09-22 15:07:38.850
場合、出力は次のようになります。
2007-09-22 15:08 -- nearest minute
2007-09-22 15 -- nearest hour
SQL Server 2008では、できれば2008の既存の関数を使用して、datetime列を最も近い時間と最も近い分に丸めたいと考えています。
この列の値の2007-09-22 15:07:38.850
場合、出力は次のようになります。
2007-09-22 15:08 -- nearest minute
2007-09-22 15 -- nearest hour
回答:
declare @dt datetime
set @dt = '09-22-2007 15:07:38.850'
select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)
戻ります
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
上記は秒と分を切り捨てるだけで、質問で求められた結果を生成します。@OMGポニーが指摘したように、切り上げ/切り捨てを行う場合は、それぞれ30分または30分を追加してから切り捨てることができます。
select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)
あなたが得るでしょう:
2007-09-22 15:08:00.000
2007-09-22 15:00:00.000
SQL Server 2008で日付データ型が追加される前は、上記の方法を使用して、日付時刻から時刻部分を切り捨てて日付のみを取得していました。問題は、問題の日時と固定時点(0
、暗黙的ににキャストする1900-01-01 00:00:00.000
)との間の日数を決定することです。
declare @days int
set @days = datediff(day, 0, @dt)
次に、その日数を固定時点に追加します。これにより、時刻が次のように設定された元の日付が得られます00:00:00.000
。
select dateadd(day, @days, 0)
またはもっと簡潔に:
select dateadd(day, datediff(day, 0, @dt), 0)
別のhour
日付部分(などmi
)を使用すると、それに応じて機能します。
datetimeoffset
、私は代用していた0
とのTODATETIMEOFFSET('1900-01-01 00:00:00', 0)
結果にローカルタイムゾーンを強制的に避けること。
あなたの例のように「四捨五入」。これは日付のvarchar値を返します。
DECLARE @date As DateTime2
SET @date = '2007-09-22 15:07:38.850'
SELECT CONVERT(VARCHAR(16), @date, 120) --2007-09-22 15:07
SELECT CONVERT(VARCHAR(13), @date, 120) --2007-09-22 15
CONVERT(datetime, CONVERT(VARCHAR(13), @date, 120)+':00:00')
私はこの質問が古く、受け入れられた代替の答えがあることを理解しています。私の答えは質問の半分しか答えないことも理解していますが、最も近い分に丸めたいが、単一の関数のみを使用して日時互換の値を保持したい人のために:
CAST(YourValueHere as smalldatetime);
数時間または数秒間、上記のジェフ緒方の答え(受け入れられた答え)を使用してください。
smalldatetime
SQL 2008年に追加されました