関数を使用してT-SQLの日時を最も近い分と最も近い時間に丸める


113

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

6
最も近い分の例は15:08にすべきではありませんか?1分あたりの秒数は60
なので

彼の質問を編集してコメントを付けることができるように、そのエラーを意図的に修正しませんでしたか?
水曜日

@MrWednesday編集とそのコメントの間に10分以上あることにお気づきでしょうか。その後、その考えが起こったと思います。
lc。

回答:


208
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)を使用すると、それに応じて機能します。


2
他の誰かがこれに遭遇することはないと思いますが、最も近い秒に切り上げて500ミリ秒を追加しようとしている場合は、datediff(second、 '1/1/2000'、.... vs datediff (第2、0 ....あなたは、オーバーフローエラーが発生しますと、0からの秒が大きすぎるIの推測である。。
エリックTwilegar

「1900年1月1日から1900年1月までの時間数を追加する」— Java / SQLでこれが発生し、見栄えが悪くなりました。私の場合、それは本当にJava側で行われるべきでした。
Corwin Newall

計算のためにdatetimeoffset、私は代用していた0とのTODATETIMEOFFSET('1900-01-01 00:00:00', 0)結果にローカルタイムゾーンを強制的に避けること。
krlmlr

26

あなたの例のように「四捨五入」。これは日付の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

varcharをdatetimeに変換すると、次のことができます(1時間の場合):CONVERT(datetime, CONVERT(VARCHAR(13), @date, 120)+':00:00')
Decula

10

私はこの質問が古く、受け入れられた代替の答えがあることを理解しています。私の答えは質問の半分しか答えないことも理解していますが、最も近い分丸めたいが、単一の関数のみを使用して日時互換の値を保持したい人のために:

CAST(YourValueHere as smalldatetime);

数時間または数秒間、上記のジェフ緒方の答え(受け入れられた答え)を使用してください。


1
すばらしい答えです。丸められるだけでなく、切り捨てられることを確認しました。このオプションを検討して誰のために、smalldatetimeSQL 2008年に追加されました
BradC

分単位のタイムアウトのみを必要とするテーブルの一部のデータを修正する必要がある場合は、これが最良のオプションです。
暗号化

-1

Select convert(char(8), DATEADD(MINUTE, DATEDIFF(MINUTE, 0, getdate), 0), 108) as Time

秒を00に切り捨てます


非常に遅く、OPが要求したように四捨五入しませんが、切り捨てたため、OPは要求しませんでした。(免責事項-私はあなたに反対票を投じませんでした)
リバースエンジニア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.