【问题标题】:Simple Oracle query: literal does not match format string简单的 Oracle 查询:文字与格式字符串不匹配
【发布时间】:2011-02-03 09:01:50
【问题描述】:

我想在 Oracle 中执行一个简单的函数。签名定义如下:

CREATE OR REPLACE FUNCTION NewCaseListForValidation
(
                             p_fromDate in DATE,
                             p_toDate in DATE,
                             p_rowCount in INT
)
RETURN
                             SYS_REFCURSOR
IS
                             return_value SYS_REFCURSOR;
...

我应该能够执行它:

var rc refcursor
exec :rc := newcaselistforvalidation('2010-01-01','2011-01-01',100);
print :rc

但是当输入“newcaselistforvalidation('2010-01-01','2011-01-01',100)”时,我得到:

ERROR at line 1:
ORA-01861: literal does not match format string
ORA-06512: at line 1

我用谷歌搜索了一下,似乎无法以正确的格式输入日期。谁能帮帮我?

【问题讨论】:

    标签: oracle sqlplus date-format ora-01861


    【解决方案1】:

    在 Oracle 中查询 NLS_PARAMETERS - 然后您将能够查看您的数据库接受的日期格式。

    但我通常使用 to_date() 函数:

    to_date('01-01-2011','DD-MM-YYYY');
    

    在英国输入我的日期。

    【讨论】:

      【解决方案2】:

      to_date() 函数的替代方法是对 DATE 或 TIMESTAMP 文字使用 ANSI 标准格式:

      日期'2010-01-31'
      时间戳'2010-01-31 21:22:23'

      始终使用 ISO 规则指定日期和时间(时间为 YYYY-MM-DD 和 24 小时格式)

      这也适用于许多其他(符合标准的)DBMS。

      【讨论】:

        【解决方案3】:

        最好不要依赖 NLS_PARAMETERS 设置中的特定值, 因为这会使你的函数在环境中break与另一个NLS_DATE_FORMAT

        我会按照上述答案中的建议在您的函数中明确指定日期格式

        exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
        

        【讨论】:

          【解决方案4】:

          插入到 tblDate (dateStart) 价值观(“2013 年 6 月 20 日”); 如果您将月份整数更改为字符串“DD-MON-YYYY”,则可以作为有效的数据字符串,而无需在其前面加上 DATE 标识符。

          【讨论】:

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