【问题标题】:Oracle - literal does not match format stringOracle - 文字与格式字符串不匹配
【发布时间】:2013-07-24 15:58:26
【问题描述】:

我有一个带有 2 个日期参数的函数:

CREATE OR REPLACE FUNCTION date_equal
(
    date1 IN DATE,
    date2 IN DATE
)
RETURN NUMBER IS
    equal BOOLEAN;
BEGIN
    equal := NVL(date1, '1999-01-01') = NVL(date2, '1999-01-01');
    IF equal THEN
        RETURN 1;
    ELSE
        RETURN 0;
    END IF;
END date_equal;
/

现在,当我在为函数提供数据的表上运行 select 时,它运行正常:

SELECT TO_DATE(some_date, 'YYYY-MM-DD') FROM tbl

但是当我尝试在函数调用中使用它时它失败了:

SELECT date_equal(TO_DATE(some_date, 'YYYY-MM-DD'), TO_DATE(some_date, 'YYYY-MM-DD')) FROM tbl

错误消息是“文字与格式字符串不匹配”。有谁知道为什么会这样?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    当你这样做时

    NVL(date1, '1999-01-01')
    

    Oracle 尝试将 '1999-01-01' 隐式转换为日期(因为 date1 是日期)。
    为此,它使用 NLS_DATE_FORMAT 可能不是 yyyy-mm-dd

    您可以使用显式转换:

    NVL(date1, to_date('1999-01-01', 'yyyy-mm-dd'))
    

    或者使用ANSI方式

    NVL(date1, date '1999-01-01')
    

    【讨论】:

      【解决方案2】:

      该错误消息肯定是由阅读NVL(date1, '1999-01-01') 引起的。

      改用nvl(date1, date '1999-01-01')

      【讨论】:

        猜你喜欢
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 2010-11-26
        • 2012-10-09
        相关资源
        最近更新 更多