【问题标题】:T-SQL: Rounding Time in to 15 minutes but only after 5 minutes past the 15minT-SQL:舍入时间为 15 分钟,但仅在 15 分钟后的 5 分钟后
【发布时间】:2019-07-16 16:37:40
【问题描述】:

我有一张带有日期时间字段的表格。我试图以 15 分钟的间隔向上/向下取整时间。但是对于非标准的数学舍入规则,如果超过 15 分钟间隔超过 5 分钟,就会发生舍入。

例如

IF 06:05 向下舍入到 06:00

IF 06:06 向上取整到 06:15

IF 06:20 向下舍入到 06:15

IF 06:21 向上取整至 06:30 等等..

我已经设法在这里找到T-SQL: Round to nearest 15 minute interval 来舍入最近的 15 分钟,但这使用数学舍入意味着 06:07 仍会向下舍入到 06:00,而不是向上舍入到 06:15。

下面的代码我必须:

cast(datepart(hour, getdate()) + datepart(minute, getdate()) / 60.00 as decimal(5, 2))

【问题讨论】:

  • 似乎最简单的处理方法是隔离分钟并使用一些 if、else/if 语句对舍入函数进行硬编码。

标签: sql tsql


【解决方案1】:

只需使用几个约会技巧。

此代码将为您提供您正在评估的时间的最高点(通过在 SQL 中将自 0 日期以来的小时数相加有效地删除分钟数):

select dateadd(hour, datediff(hour, 0, getdate()), 0)

从那里,您需要一个 CASE 表达式来评估所讨论的时间属于小时的哪个四分位数(这里只是一个 sn-p):

  case 
    when datepart(minute, dtm) > 50 then 60
    when datepart(minute, dtm) > 35 then 45
    when datepart(minute, dtm) > 20 then 30
    when datepart(minute, dtm) > 5  then 15
    else 0
  end

将这两部分与DATEADD 放在一起,以决定我们要在偶数小时标记上增加多少分钟:

declare @dtms table (dtm datetime);
insert @dtms (dtm)
values ('2019-07-16T12:05:00'),
       ('2019-07-16T12:06:00'),
       ('2019-07-16T12:21:00'),
       ('2019-07-16T12:29:00'),
       ('2019-07-16T12:35:00'),
       ('2019-07-16T12:38:00'),
       ('2019-07-16T12:56:00')

select
  dtm,
  dateadd(minute, 
    case 
      when datepart(minute, dtm) > 50 then 60
      when datepart(minute, dtm) > 35 then 45
      when datepart(minute, dtm) > 20 then 30
      when datepart(minute, dtm) > 5  then 15
      else 0
    end, dateadd(hour, datediff(hour, 0, dtm), 0)) as rounded
from @dtms;

结果:

+-------------------------+-------------------------+
|           dtm           |         rounded         |
+-------------------------+-------------------------+
| 2019-07-16 12:05:00.000 | 2019-07-16 12:00:00.000 |
| 2019-07-16 12:06:00.000 | 2019-07-16 12:15:00.000 |
| 2019-07-16 12:21:00.000 | 2019-07-16 12:30:00.000 |
| 2019-07-16 12:29:00.000 | 2019-07-16 12:30:00.000 |
| 2019-07-16 12:35:00.000 | 2019-07-16 12:30:00.000 |
| 2019-07-16 12:38:00.000 | 2019-07-16 12:45:00.000 |
| 2019-07-16 12:56:00.000 | 2019-07-16 13:00:00.000 |
+-------------------------+-------------------------+

【讨论】:

  • 分辨率很高。效果很好。
  • 很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2020-03-23
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多