2

我想在 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

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

4

4 回答 4

10

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

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

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

在英国输入我的日期。

于 2011-02-03T09:10:33.217 回答
5

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

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

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

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

于 2011-02-03T09:47:47.703 回答
1

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

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

exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
于 2011-05-25T09:44:48.657 回答
0

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

于 2013-06-18T19:00:18.707 回答