SQL日期转换结果为 "invalid number format model parameter."

标签 sql oracle oracle11g date-formatting date-arithmetic

我必须从 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.

我对变量 fromDatetoDate 的输入只是日期字符串,例如 20111010 等。我也尝试过更具体的时间(相同格式如表中所示),但这似乎不是问题..

在数据库中,CREATE_TIME 列是 TIMESTAMP(6) 类型,例如一个示例是 2011/12/19 08:04:42

有什么想法为什么会弹出这个错误吗?

最佳答案

根本原因:

您正在将 NUMBER 转换为 STRING,假设它是 DATE20111010 不是日期,而是数字。另外,'20111010' 不是日期,而是字符串。他们是完全不同的。

  • 20111010 - 数字
  • “20111010” - STRING
  • TO_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/

相关文章:

Oracle PL/SQL 存储过程编译器与 PostgreSQL PGSQL 存储过程编译器

sql - Oracle-插入具有自动增量ID的新行

Mysql - 选择到 XML

mysql - 将 varchar 列移动到不同的表并稍后使用联接是否会提高性能?

java - Oracle SQL Developer 加载 Java 错误

mysql - 三个或更多表 JOIN USING USING common key

oracle11g - 在 Windows Server 2012 中安装 Oracle 11gR2

sql - 我无法使用 Autotrace Traceonly Oracle 打印统计信息

sql - 将数据库字符串枚举转换为整数值得吗?

mysql - Database Join连接4张表