【问题标题】:Oracle timestamp roundingOracle 时间戳舍入
【发布时间】:2016-09-06 09:03:42
【问题描述】:

我在 orcle db 中有一个日期值 - 08.06.16 19:56:20,473000000。

CR_DATE - TIMESTAMP(6)

我需要将日期截断到前一小时的开头并转换为纪元格式。例如,如果日期如上所述,那么它应该四舍五入到 08.06.16 19:00:00,然后转换为纪元,这应该给我最终的 o/p 为 1465412400

我可以使用以下查询更改为纪元格式,但四舍五入到最近的时间不起作用。

ROUND((CAST(CR_DATE AS DATE) - DATE '1970-01-01') * 24 * 60 * 60, 0) AS creationDate

如果我使用

select CR_DATE,TRUNC(CREATION_DATE, 'HH24')  AS creationDate

然后我得到的值为 08.06.16,HH:MM 详细信息被截断。

DB中设置的NLS_TIMESTAMP_FORMAT是DD.MM.RR HH24:MI:SSXFF

有人可以在不更改 NSL 格式的情况下帮我解决这个问题吗?

【问题讨论】:

  • 您说“四舍五入到最近的小时”,但您的示例似乎表明您想要截断到前一小时的顶部。两者哪个是正确的。 trunc(creation_date, 'HH24') 将返回截断为小时的 date。您的客户端可能不会显示时间部分,但它仍然存在。
  • 感谢您对此进行调查。是的,它被截断到前一小时的顶部,实际上是最近的一小时。为错误道歉。但是我如何也随着时间的推移获得价值。我不希望时间部分完全发出。
  • “实际上到最近的时间”是什么意思?听起来我们又回到了舍入而不是截断
  • 我已经更新了这个问题。它被截断到前一小时。这是评论中的错字,它不允许我更改它并保存回来。

标签: oracle timestamp


【解决方案1】:

听起来像你想要的

ROUND( (TRUNC( CAST(CR_DATE AS DATE), 'HH24') - 
          DATE '1970-01-01') * 24 * 60 * 60, 0) AS creationDate

trunc(some_date, 'HH24') 将返回截断到最接近小时的日期。您的客户端可能默认不显示时间组件,但它仍然存在。

with x as (
  select timestamp '2016-06-08 19:56:20.473' cr_date
    from dual
)
select ROUND( (TRUNC( CAST(CR_DATE AS DATE), 'HH24') - 
              DATE '1970-01-01') * 24 * 60 * 60, 0) AS creationDate
  from x;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多