【问题标题】:Oracle SQL 11g date value being retrieved as dd/mm/00yy instead of dd/mm/yyOracle SQL 11g 日期值被检索为 dd/mm/00yy 而不是 dd/mm/yy
【发布时间】:2014-09-30 13:52:01
【问题描述】:
CREATE TABLE Customer (Customer_Id number PRIMARY KEY, First_Name varchar2(20), Last_Name varchar2(20), DOB date, Gender varchar2(1), PAN_No varchar2(20) UNIQUE);

INSERT INTO Customer VALUES(301, 'Robert', 'William', '05/10/86', 'M', 'PF58757');

SELECT * FROM Customer;

出生日期字段显示为 05/10/0086。我希望它是 05/10/86。

请帮忙。

【问题讨论】:

    标签: sql oracle date oracle11g


    【解决方案1】:

    您的NLS_DATE_FORMAT 似乎是DD/MM/YYYYMM/DD/YYYY。插入两位数的年份时,取 86 表示 0086。您应在插入时指定格式:

    INSERT INTO Customer VALUES(301, 'Robert', 'William',
      TO_DATE('05/10/86', 'DD/MM/RR'), 'M', 'PF58757');
    

    'MM/DD/RR',具体取决于您所在的位置。

    RR date format element 是为了解决千年虫问题而创建的,实际上没有必要再使用它;您的数据应提供四位数的年份。但即使您的数据可以更改为四位数,您仍然应该指定格式模型,因为另一个会话可能有完全不同的内容,这可能会导致失败或数据损坏。您永远不应该依赖 NLS 设置。

    Trivial SQL Fiddle demo.

    【讨论】:

    • 感谢您的快速回复。当我输入不同的数据时,我的 NLS_DATE_FORMAT 似乎是 MM/DD/YYYY INSERT INTO Customer VALUES(301, 'Robert', 'William', TO_DATE('21/10/86','MM/DD/YY'), ' M', 'PQ56794');我收到一条错误消息,指出月份无效。我希望将其转换为 DD/MM/YY。
    • @MayankDeswal - 这不是您的 NLS_DATE_FORMAT,这是您尝试插入的日期格式提供给您。但是是的,如果您有一个像 21/10/86 这样的日期,那么您需要在 to_date() 调用中指定一个匹配模型。检查有关 RR 的链接,看看它是否比 YY 更适合您。如果该日期应该是 1986 年(可能是出生日期!),那么您需要使用 RR,otherwise it would be stored as 2086
    • 好的,我对此进行了更多研究,现在我明白了。现在我能够以我的格式(DD/MM/RR)输入数据。然而最后一件事是当我检索数据时,格式是 MM/DD/RRRR。我可以使用 TO_CHAR() 更改 sysdate 的输出格式,但我不能使用硬编码日期。
    • @MayankDeswal - 你为什么不能select to_char(dob, 'MM/DD/RR')?它对任何日期字段的工作方式与对sysdate 的工作方式完全相同。如果您不使用to_char,那么它将再次使用您会话的 NLS_DATE_FORMAT 显示。不过,不太确定您对硬编码日期的含义。
    • 哦,我的错。是的,我现在明白了。你是对的。我只是误解了一些东西。我是在 INSERT 中进行格式输出,而我应该在 SELECT 下完成。现在可以了。谢谢亚历克斯
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2012-03-05
    相关资源
    最近更新 更多