Rounding a datetime value down to the nearest half hour

前端 未结 6 573
再見小時候
再見小時候 2021-01-11 13:11

I have a requirement to round a datetime2 value down to the nearest half hour. For example \'10/17/2013 12:10:00.123\' would round down to \'10/17/2013 12:00:00.0\' And \'10

相关标签:
6条回答
  • 2021-01-11 13:44

    @Twinkles's answer works well in SQL server to round to closest half an hour.

    However, in development, strongly recommend use FLOOR to round to last half an hour.

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

    0 讨论(0)
  • 2021-01-11 13:55

    The answer by Ian is good, but it contains an unnecessary conversion. I suggest

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

    If you want to round to the nearest half-hour instead of always rounding down, use

    SELECT CONVERT(smalldatetime, ROUND(CAST([columnname] AS float) * 48.0,0)/48.0) FROM [tableName]
    
    0 讨论(0)
  • 2021-01-11 14:05

    How about this

    declare @d datetime = '2013-05-06 12:29.123'
    select 
    case 
        when datepart(minute, @d) < 30 then cast(dateadd(minute, -datepart(minute,@d)-datepart(second,@d), @d) as smalldatetime)
        when datepart(minute, @d) >= 30 then cast(dateadd(minute, -datepart(minute,@d)-datepart(second,@d)+30, @d) as smalldatetime)
    end
    
    0 讨论(0)
  • 2021-01-11 14:06

    Here is a slightly different approach that I used when I needed to round down to the nearest 5 minute interval. There is probably a way to simplify this further, but at least this got me what I needed.

    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
    
    0 讨论(0)
  • 2021-01-11 14:07
    select cast(floor(cast(
        cast('10/17/2013 12:34:00' as datetime) 
    as float(53)) * 48) / 48 as datetime)
    

    EDIT

    Works better if you use smalldatetime to avoid the extra precision

    select cast(floor(cast(
        cast('2012-01-02 11:33:14.097' as smalldatetime) 
    as float(53)) * 48) / 48 as smalldatetime)
    
    0 讨论(0)
  • 2021-01-11 14:08

    Here is one way to do it:

    update t set
      d = dateadd(minute,datediff(minute,'19000101',d)/30*30,'19000101');
    
    0 讨论(0)
提交回复
热议问题