13

datetime2 の値を最も近い 30 分に丸める必要があります。たとえば、「10/17/2013 12:10:00.123」は「10/17/2013 12:00:00.0」に切り捨てられ、「10/17/2013 12:34:17.123」は 10/17 に切り捨てられます/2013 12:30:00.0'. 私が最初に考えたのは、日付と時刻を分割してそのようにする UDF を作成することでした。しかし、このようなことが単一の T-SQL ステートメントで実行できるかどうか疑問に思っています。

私は SQL Server 2012 を使用しており、列のデータ型は dateTime2 です (これは float に変換できません!!)

4

7 に答える 7

16

Ian の回答は適切ですが、不要な変換が含まれています。私は提案します

SELECT CONVERT(smalldatetime, ROUND(CAST([columnname] AS float) * 48.0,0,1)/48.0) FROM [tableName]

常に切り捨てるのではなく、最も近い 30 分に丸めたい場合は、

SELECT CONVERT(smalldatetime, ROUND(CAST([columnname] AS float) * 48.0,0)/48.0) FROM [tableName]
于 2013-10-17T13:46:32.573 に答える
1

これを行う1つの方法は次のとおりです。

update t set
  d = dateadd(minute,datediff(minute,'19000101',d)/30*30,'19000101');
于 2013-10-17T19:59:52.283 に答える
0
select cast(floor(cast(
    cast('10/17/2013 12:34:00' as datetime) 
as float(53)) * 48) / 48 as datetime)

編集

余分な精度を避けるために smalldatetime を使用すると、より適切に機能します

select cast(floor(cast(
    cast('2012-01-02 11:33:14.097' as smalldatetime) 
as float(53)) * 48) / 48 as smalldatetime)
于 2013-10-17T13:34:25.377 に答える
0

これは、最も近い 5 分間隔に切り下げる必要があるときに使用した、少し異なるアプローチです。おそらくこれをさらに単純化する方法がありますが、少なくともこれで必要なものが得られました。

DECLARE @now datetime = GETDATE()

SELECT @now as cur_datetime, DATEADD(MINUTE, -(DATEDIFF(MINUTE,DATEADD(HOUR,DATEDIFF(HOUR,0,@now), 0),DATEADD(MINUTE,DATEDIFF(MINUTE,0,@now), 0)) % 5), DATEADD(MINUTE,DATEDIFF(MINUTE,0,@now), 0)) as round_down_to_nearest_5_minute_mark
于 2016-08-18T15:41:43.820 に答える
0

@Twinklesの答えは、SQLサーバーでうまく機能し、最も近い30分に丸められます。

ただし、開発中は、FLOOR を使用して30 分が続くように丸めることを強くお勧めします。

SELECT CONVERT(datetime, FLOOR(CAST([columnname] AS float) * 48.0)/48.0) FROM [tableName]

于 2018-10-25T19:13:30.817 に答える