【问题标题】:Convert Date strored as number(32,0) in oracle在 oracle 中转换存储为 number(32,0) 的日期
【发布时间】:2021-08-06 02:57:26
【问题描述】:

我在将日期从 Tririga 数据库导入 SQL 数据库时遇到问题。主要是我无法正确转换日期,而且看起来不是我见过的常见格式。

例如传入的日期值 775724400000

运行类似 select to_date('765187200000', 'DDMMYYYYHH24MISS') my_date FROM dual; 给我一个错误 ORA-01847: 月中的某天必须介于 1 和月的最后一天之间 01847. 00000 - “日期必须介于 1 和最后一天之间”

我发现此链接中的以下信息似乎也来自 tririga link_help

这个数字的大小大约是 10 位,而这个是 12,我知道事实上这个日期应该是过去 10 年(其中大部分) 我似乎找不到任何可以回答如何将其转换为正确日期的信息。

有什么建议吗?

【问题讨论】:

标签: oracle date


【解决方案1】:

输入数字似乎是“纪元”,即自 1970 年 1 月 1 日 GMT (UTC) 以来经过的毫秒数。

转换成日期并不难:

select date '1970-01-01' + (775724400000 / 86400000) as dt from dual;

DT                  
--------------------
1994-Aug-01 07:00:00

注意硬编码文字:date '1970-01-01'(根据定义,纪元是从该日期的午夜开始计算的)和86400000。根据其中一个定义(在国际单位和重量系统的先前版本中),一秒是一天中位数的 1/86400。在 Oracle 中,日期运算基于代表一天的数字 1,因此要将毫秒转换为天,您必须将输入除以 86400 * 1000。

最微妙的问题与时区有关(可能还有夏令时,也与时区有关)。在大多数情况下,纪元是从格林威治标准时间 1970 年 1 月 1 日午夜开始计算的,而不是从当地时间 1970 年 1 月 1 日午夜开始计算的。你需要为此调整吗?只有您和您的业务用户才能回答这个问题。

(顺便说一句,您提供的数字并不代表过去 10 年的日期 - 甚至不接近。)

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2012-06-26
    相关资源
    最近更新 更多