Oracle DB 中的日期时间格式不正确,转换为小时和分钟

Posted

技术标签:

【中文标题】Oracle DB 中的日期时间格式不正确,转换为小时和分钟【英文标题】:incorrect date time format in Oracle DB, convert to hours and minutes 【发布时间】:2021-01-23 23:37:29 【问题描述】:

不要问我为什么,但由于某种原因,我们有一个格式错误的日期时间列,我需要帮助转换。

来自 DB 的示例时间戳:01-OCT-20 12.18.44.000000000 AM

在上面的示例中,小时实际上是 18,分钟是 44。

不确定这是如何在 12 之前发生的,这是所有内容的默认设置。我想要做的就是从 2 个时间戳中获取 HH:MM 的差异,但我不知道如何正确转换它,小时在分钟部分,分钟在秒部分。

我正在寻找的示例:

01-OCT-20 12.18.44.000000000 AM - 01-OCT-20 12.12.42.000000000 AM

输出:06:02。所以在这种情况下,时间跨度是 6 小时 2 分钟。

谢谢,

【问题讨论】:

这与your previous question 非常相似。你检查过那里收到的答案吗? 是的,我实际上正在删除它,我认为我提出问题的方式做得不好,所以我重写了它。我尝试了答案,但没有一个有效,所以我认为简化我想要的会有所帮助。 刚刚意识到我不能删除帖子大声笑 2020-10-01 00:18:442020-10-01 18:44:00 之间的差异(分钟映射到小时,秒映射到分钟)是 18 小时 25 分钟和 16 秒。如何计算 6 小时 2 分钟? (我还建议您使用 24 小时制而不是 12 小时制,因为这可能会造成混乱。) “格式”表示它的显示方式,就像您可以显示与1.2301.230 等相同的数字。这些是格式。 实际存储值 是您无法读取的内部二进制值,任何答案都将在很大程度上取决于列定义(varchar2(30)timestamp with local timezonedate 等) .那么,问题是关于格式还是值,以及列是如何定义的? 【参考方案1】:

在上面的示例中,小时实际上是 18,分钟是 44。

不确定这是如何在 12 之前发生的,这是所有内容的默认设置。我想要做的就是从 2 个时间戳中获取 HH:MM 的差异,但我不知道如何正确转换它,小时在分钟部分,分钟在秒部分。

要将分钟转换为小时,您需要乘以 60。 要将秒转换为分钟,还需要乘以 60。 因此,如果您想转换正确值的时间部分,那么您需要从午夜开始的时间并将其全部乘以 60。 如果您想获得当前时间和正确时间之间的差值(乘以 60 后),则需要减去当前时间(可以简化为仅乘以 59)。

所以要得到你可以使用的时差:

SELECT (value - TRUNC(value))*59 AS difference,
       value + (value - TRUNC(value))*59 AS updated_value
FROM   table_name;

因此,对于您的示例数据:

CREATE TABLE table_name ( value ) AS
SELECT TO_TIMESTAMP( '01-OCT-20 12.18.44.000000000 AM', 'DD-MON-RR HH12.MI.SS.FF9 AM' ) FROM DUAL

那么输出是:

区别 | UPDATED_VALUE :---------------------------- | :------------- +000000000 18:25:16.000000000 | 2020-10-01 18:44:00.000000

db小提琴here

如果您想比较两个错误值,只需从另一个中减去一个时间戳并乘以 60(假设小时在 24 小时制中始终为 12 AM00):

SELECT (value1 - value2) * 60 AS difference,
       value1,
       value1 + (value1 - TRUNC(value1))*59 AS updated_value1,
       value2,
       value2 + (value2 - TRUNC(value2))*59 AS updated_value2
FROM   table_name;

所以,对于样本数据:

CREATE TABLE table_name ( value1, value2 ) AS
SELECT TO_TIMESTAMP( '01-OCT-20 12.18.44.000000000 AM', 'DD-MON-RR HH12.MI.SS.FF9 AM' ),
       TO_TIMESTAMP( '01-OCT-20 12.12.42.000000000 AM', 'DD-MON-RR HH12.MI.SS.FF9 AM' )
FROM DUAL

输出是:

区别 |价值1 | UPDATED_VALUE1 |价值2 | UPDATED_VALUE2 :---------------------------- | :------------------------- | :------------------------- | :------------------------- | :------------- +000000000 06:02:00.000000000 | 2020-10-01 00:18:44.000000 | 2020-10-01 18:44:00.000000 | 2020-10-01 00:12:42.000000 | 2020-10-01 12:42:00.000000

这给出了 6 小时 2 分钟的差异。

db小提琴here

【讨论】:

以上是关于Oracle DB 中的日期时间格式不正确,转换为小时和分钟的主要内容,如果未能解决你的问题,请参考以下文章

时间戳转为日期格式

oracle 时间格式转换的问题

将时间戳转化为日期格式

将 JDE 日期格式转换为 DB2

oracle日期转换问题

如何将这种特定格式的当前日期正确设置到 Oracle DB 上的这个插入查询中? [关闭]