【问题标题】:Oracle datetime error - year values in the tens of thousands? [duplicate]Oracle 日期时间错误 - 数万年的值? [复制]
【发布时间】:2020-09-21 12:24:14
【问题描述】:

我遇到了一个错误,我的一个表格中的某些日期显示为当年超过 10,000 个。例如查询

SELECT 
    my_date, to_char(my_date), 
    (my_date - TO_DATE('1970-01-01','YYYY-MM-DD') ) * 86400, 
    extract(year from my_date) 
FROM my_table

返回:

01-NOV-74   00-000-00   413548617599.9999999999999999999999999997   15074
15-AUG-68   00-000-00   366017127719.9999999999999999999999999999   13568
30-SEP-62   00-000-00   375298841999.9999999999999999999999999998   13862
29-SEP-82   00-000-00   325438773599.9999999999999999999999999998   12282
01-AUG-13   01-AUG-13   1375315200  2013

知道这里发生了什么吗?最后一个日期看起来不错,但其余日期已关闭。是我不知道 Oracle 在内部使用的某种日期格式吗?还是在此表中输入的日期不正确,我无法检索到实际值?

【问题讨论】:

  • 该列是DATE 列还是TIMESTAMP 列? DATETIME 不是 Oracle 中列定义的有效类型。 DATE 列也包括捕获时间。找出列的数据类型是解决问题的第一步。
  • 对不起,应该更清楚。该列的类型为DATE。我还用更多细节更新了问题。
  • 如果您尝试生成一个 5 位数字的日期,那么您会收到错误消息 (db<>fiddle),但我链接的副本显示,理论上,它可以存储最多 15599 年的日期但是这样做会使像TO_CHAR 这样的内置函数失败(优雅地)。 ...
  • 您可以使用链接的副本来获取年、月、日、小时、分钟或秒的值,但如果您希望检索 4 位数的年份,那么您将不走运,因为行有5 位数的年份,您必须删除行或将其编辑为合理的值,
  • PostgreSQL 可以处理 10000 年以上的日期并返回 15074-11-01 08:00:00 13568-08-15 08:22:00 13862-09-30 14:20:00 12282-09-29 11:20:00 您是如何设法将这些日期导入 Oracle 的? dbfiddle.uk/…

标签: sql oracle date datetime


【解决方案1】:

如果MY_DATEdate,对我来说没问题:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> desc my_table
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ----------------------
 MY_DATE                                                        DATE

SQL> select * from my_table;

MY_DATE
----------
01.11.1974
15.08.1968

SQL> SELECT
  2      my_date, to_char(my_date),
  3      (my_date - TO_DATE('1970-01-01','YYYY-MM-DD') ) * 86400 calc,
  4      extract(year from my_date)
  5  FROM my_table;

MY_DATE    TO_CHAR(MY       CALC EXTRACT(YEARFROMMY_DATE)
---------- ---------- ---------- ------------------------
01.11.1974 01.11.1974  152496000                     1974
15.08.1968 15.08.1968  -43545600                     1968

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    相关资源
    最近更新 更多