SQL日期转换结果为;无效的数字格式模型参数。”;
我必须SQL日期转换结果为;无效的数字格式模型参数。”;,sql,oracle,oracle11g,date-formatting,date-arithmetic,Sql,Oracle,Oracle11g,Date Formatting,Date Arithmetic,我必须选择Oracle 11g数据库中的一些数据,但我似乎无法理解以下select查询失败的原因: SELECT INFO_ID, INFO_DETAIL, IMPORTANT_FLG, DELETE_FLG, CREATE_TIME, DISPLAY_ORDER FROM TABLE_NAME WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD') BETWEEN TO_DAT
选择Oracle 11g
数据库中的一些数据,但我似乎无法理解以下select
查询失败的原因:
SELECT
INFO_ID,
INFO_DETAIL,
IMPORTANT_FLG,
DELETE_FLG,
CREATE_TIME,
DISPLAY_ORDER
FROM TABLE_NAME
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD') AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
ORDER BY IMPORTANT_FLG DESC NULLS LAST , DISPLAY_ORDER ASC NULLS LAST, CREATE_TIME DESC, INFO_ID ASC
查询失败,错误消息如下:
ORA-01481: invalid number format model
01481. 00000 - "invalid number format model"
*Cause: The user is attempting to either convert a number to a string
via TO_CHAR or a string to a number via TO_NUMBER and has
supplied an invalid number format model parameter.
我对变量fromDate
和toDate
的输入只是日期字符串,如20111010
等。我还尝试了更具体的时间(与表中的格式相同),但这似乎不是问题
在数据库中,CREATE\u TIME
列是TIMESTAMP(6)
type,例如一个示例是2011/12/19 08:04:42
你知道为什么会出现这种错误吗?根本原因:
SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
*
ERROR at line 1:
ORA-01481: invalid number format model
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
您正在将一个数字转换为字符串,假设它是日期<代码>20111010
不是日期,而是数字。另外,'20111010'
不是日期,而是字符串。他们完全不同
-编号20111010
-字符串'20111010'
-日期截止日期('20111010','yyyyymmdd')
SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
*
ERROR at line 1:
ORA-01481: invalid number format model
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
进入您的查询:
SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
*
ERROR at line 1:
ORA-01481: invalid number format model
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
您使转换和格式设置变得不必要的复杂
时间戳数据类型是日期数据类型的扩展。除了DATE数据类型的datetime元素外,TIMESTAMP数据类型还保存小数点到小数点后0到9位之间的精度,默认值为6
在数据库中,CREATE_TIME列是TIMESTAMP(6)类型,例如一个示例是2011/12/19 08:04:42
由于您正在处理时间戳,因此可以使用来设置时间戳
执行日期/时间戳算法时,应保持数据类型不变,而不是将其转换为字符串。您只需要使用来显示字符
将筛选谓词修改为:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
上面的:fromDate
和:toDate
应该是字符串,而不是数字
比如说,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
或者,使用将字符首先转换为字符串:
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
我希望这个解决方案有帮助 有太多不必要的转换 我在我的系统中模拟了相同的场景
这里创建的
时间是一列数据类型时间戳(6)
我不知道PL/SQL(由Oracle使用),但您应该能够使用ISO-8601(yyyy-MM-dd
)作为格式。你试过用破折号代替斜杠吗?@dai,谢谢你的建议。不幸的是,即使使用破折号,我也会遇到同样的错误(我尝试过:不使用破折号作为输入,使用破折号作为输入,并且使用破折号作为TO_CHAR参数)TO_CHAR(:fromDate,'YYYY/MM/DD')
是错误的。您正在将数字转换为字符串,假设它是日期<代码>20111010
不是日期,而是数字。另外,'20111010'
不是日期,而是字符串。他们完全不同。这教会了我一些东西,同时解决了问题。应该可以进行两次投票;)@天哪……答案在哪里?@LalitKumarB这可能不是你的答案。但我已经把他引向了正确的方向。答案太简单了,不要在SQL中做不必要的事情,保持简单。此外,您已经提供了答案,如果我的答案是错误的,OP将永远不会评论我的答案是正确的。