【问题标题】:SQL "not a valid month"SQL“不是一个有效的月份”
【发布时间】:2012-10-11 17:46:57
【问题描述】:

我在sql中有一张表如下:

CREATE TABLE Reserves(
    sid INTEGER,
    bid INTEGER,
    day DATE,
    PRIMARY KEY (sid, bid, day),
    FOREIGN KEY (sid) REFERENCES Sailors,
    FOREIGN KEY (bid) REFERENCES Boats
);

我正在尝试插入:

INSERT INTO Reserves VALUES(22, 101, '01-01-1998');

但我收到错误:ORA-01843: not a valid month

这是一个 Oracle 数据库。我不确定我的日期格式有什么问题。

【问题讨论】:

  • 作为一般规则,除非您明确声明日期格式,否则您应该始终使用文化非特定日期格式 (yyyyMMdd)。 02-01-2012 可能是 2012 年 1 月 2 日或 2012 年 2 月 1 日,但 20120102总是 2012 年 1 月 2 日

标签: sql oracle


【解决方案1】:

不完全清楚你想要哪个,所以你可以试试:

  • 对于月-日-年格式:

    INSERT INTO Reserves VALUES(22, 101, TO_DATE('01-01-1998','MM-DD-YYYY'));

  • 对于日-月-年格式:

    INSERT INTO Reserves VALUES(22, 101, TO_DATE('01-01-1998','DD-MM-YYYY'));

另外,推荐阅读:Oracle functions: TO_DATE

【讨论】:

    【解决方案2】:

    您可以使用 date 关键字来指定 ANSI 标准的日期字符串:

    INSERT INTO Reserves VALUES(22, 101, date '1998-01-01');
    

    在这种情况下,格式为 YYYY-MM-DD,即 1998 年 1 月 1 日。

    【讨论】:

    • 谢谢鲍勃。我希望有一种方法可以让我不必使用 TO_DATE 函数。
    【解决方案3】:

    正如@Jody 也提到的,
    您可以通过在INSERT 之前执行此代码一次来更改会话的默认值:

    ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY';

    您可以按您喜欢的任何顺序更改格式。

    来源:dba-oracle.com

    【讨论】:

      【解决方案4】:

      试试“1998-01-01”。

      我相信 oracle 的默认日期格式是 yyyy-mm-dd。您可以使用 alter session set nls_date_format='mm-dd-yyyy' 更改会话的默认值

      请记住,大多数客户端允许您将其永久设置为您喜欢的任何内容

      【讨论】:

        【解决方案5】:

        您也可以尝试以下查询格式:

        INSERT INTO Reserves VALUES(22, 101, DATE '01-01-1998');

        DATE 关键字将以下字符串解释为日期。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-07
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 2012-03-23
          • 2017-09-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多