【问题标题】:ORACLE DATETIME ROUND UP WHEN MINUTES <> 0当分钟 <> 0 时,ORACLE 日期时间向上取整
【发布时间】:2021-10-29 12:21:28
【问题描述】:

我有一个约会时间:

select to_date(to_char(r.DATETIMEUTC,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') as DATETIME_UTC,
       round(r.DATETIMEUTC, 'hh') as rounded
from   PROD.WX_RAW r;

当分钟不等于 00 时,我需要四舍五入。

例子:

2000 年 1 月 1 日凌晨 2:37:00 => 应该是 => 2000 年 1 月 1 日凌晨 3:00:00。 (如果小时 =00,不要四舍五入) 2000 年 1 月 1 日凌晨 2:00:00 => 应该是 => 2000 年 1 月 1 日凌晨 2:00:00

现在我的代码具有舍入功能,但这个看起来最接近小时,即使分钟是 15,我也需要将小时四舍五入,除非分钟为 00,在这种情况下我需要保留小时。

问候

【问题讨论】:

  • 如果分钟为 0 但秒为非零怎么办? 2:00:01 会舍入到 2:00:00 还是 3:00:00?
  • 仅以分钟为参考
  • 嗯,我不确定这意味着什么。您是否完全忽略了秒数?还是“分钟 0”真的意味着“日期不完全是小时”?
  • 忽略秒,所有记录的秒数都在 00

标签: sql oracle datetime timestamp roundup


【解决方案1】:

我会将date 截断为小时,然后使用case 语句来决定是否添加小时。

trunc( r.DATETIMEUTC, 'HH24' ) -- truncate to the hour
+ case when to_number( to_char( r.DATETIMEUTC, 'HH24' ) ) != 0
       then interval '1' hour
       else null
    end

【讨论】:

  • 嗨,贾斯汀,我需要将小时四舍五入,例如 2000 年 1 月 1 日凌晨 2:37:00 到 2000 年 1 月 1 日凌晨 3:00:00,而不是分钟,如果datetime 小时向上 1 到 59 分钟,也将分钟放入 00 一次向上取整
  • @Webb - 抱歉,我复制并粘贴了几分钟的版本。更新
  • to_number(to_char)) 不是很吸引人; extract(hour from ...) 似乎更自然。更自然的是,将比较条件更改为 when datetimeutc != trunc(datetimeutc, 'hh') then ... 还要注意,您的公式有一个明显的错误:else 部分应该是 interval '0' hour,如果将 null 添加到任何内容,则结果是 null。 (您可能认为 0 也可以在 else 子句中使用,但它不会 - case 表达式中的值必须是相同的数据类型,一个不能是间隔而另一个是一个数字。)
【解决方案2】:

假设datetimeutcdate数据类型的输入值,你可以这样做:

select trunc(datetimeutc + interval '59' minute, 'hh')
from   .....

数学很简单,但大多数程序员无论如何都不会相信数学;他们会在几个例子中使用这个公式来说服自己它是正确的。所以我不会在乎正式的证明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 2018-10-28
    • 1970-01-01
    • 2012-08-03
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多