我必须从 Oracle 11g
数据库中select
一些数据,但我似乎无法弄清楚为什么以下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_TIME
列是 TIMESTAMP(6)
类型,例如一个示例是 2011/12/19 08:04:42
有什么想法为什么会弹出这个错误吗?
最佳答案
根本原因:
您正在将 NUMBER 转换为 STRING,假设它是 DATE。 20111010
不是日期,而是数字。另外,'20111010'
不是日期,而是字符串。他们是完全不同的。
20111010
- 数字“20111010”
- STRINGTO_DATE('20111010','YYYYMMDD')
- 日期
错误:
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')
您不必要地使转换和格式变得复杂。
TIMESTAMP 数据类型是DATE 数据类型的扩展。除了 DATE 数据类型的日期时间元素之外,TIMESTAMP 数据类型还将秒的小数部分保存为 0 到 9 位小数之间的精度,默认值为 6。
In the database the CREATE_TIME column is TIMESTAMP(6) type, and for example one sample is 2011/12/19 08:04:42
由于您正在处理TIMESTAMP,因此您可以使用TO_TIMESTAMP。
在进行日期/时间戳算术时,您应该保持数据类型不变,而不是将其转换为字符串。您只需将TO_CHAR用于显示。
将过滤谓词修改为:
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
或者,使用TO_CHAR首先将数字转换为字符串:
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
关于SQL日期转换结果为 "invalid number format model parameter.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33687413/