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将永远不会评论我的答案是正确的。