【问题标题】:Rounding time in SQL ServerSQL Server 中的舍入时间
【发布时间】:2021-05-13 12:24:45
【问题描述】:

我需要在 SQL Server 中将时间四舍五入到最近的四分之一。

例如:

  • '2016-11-06 13:12:23.000' --> '2016-11-06 13:15:00.000'

  • '2016-11-06 13:06:23.000' --> '2016-11-06 13:00:00.000'

到目前为止我已经尝试过了

declare @var datetime = '2016-11-06 13:12:35.000'

select @var as original_time

select 
    dateadd(minute, datediff(minute, 0, @var) / 15 * 15, 
    iif(datediff(minute, 0, @var) % 15.0 < 7.5, 0, 
    iif(datediff(minute, 0, @var) % 15.0 < 21.0, 15, 30 ) ))

输出:

预期的结果是 '2016-11-06 13:15:00.000' 但这是我得到的输出。

我在尝试之前提到了this question

【问题讨论】:

  • 您是向上还是向下舍入,还是只取最接近的值?

标签: sql-server datetime ssms


【解决方案1】:

转换为浮点数,将日期作为整数,将时间作为分数。然后四舍五入为 24(小时)* 4(季度)

select CONVERT(DATETIME,ROUND(CONVERT(FLOAT, @var)*24*4,0)/24/4)

将 ROUND 更改为 CEILING 或 FLOOR 以进行向上或向下舍入

【讨论】:

  • float 在处理精确值时是一个糟糕的数据类型选择。
  • 我检查了它保持精确到毫秒
  • float 是一种不精确的数据类型,存储日期和浮点值没有意义
  • 它对于这种用途来说足够精确。日期时间在 SQL Server 内部存储为 2 个整数。 1 代表日期,1 代表时间。时间仅精确到 1/300 秒。因此可以说,DateTime 数据类型是一种不精确的存储日期/时间的方式。
  • 任何方法来修复从 06:59 到 07:00 的舍入时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多