我在查询中给出了以下代码。
where to_date(cal_wid,'yyyymmdd')
between add_months(to_date(sysdate, 'MM-YYYY'),-12)
and to_date(sysdate, 'MM-YYYY')
我遇到了以下错误。 (我在 Xampp 服务器上做)
Warning: oci_execute(): ORA-01843: not a valid month in C:\xampp\htdocs\xxx\index.php on line 149
Warning: oci_fetch_array(): ORA-24374: define not done before fetch or execute and fetch in C:\xampp\htdocs\xxx\index.php on line 160
谁能告诉我为什么会出现此错误?
最佳答案
永远不要使用 TO_DATE()
在已经是 DATE
的东西上.这样做的原因是因为 Oracle 将不得不进行一些隐式转换以遵循您的意愿:
TO_DATE(sysdate, 'mm-yyyy')
真正运行为
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
因此,如果您的 nls_date_format 设置为“mm-yyyy”以外的值,您就会遇到问题。默认的 nls_date_format 参数是“DD-MON-YY”,这很可能是您设置的值。
如果您只想将 add_months 添加到当月的第一天,那么您应该使用 TRUNC()
,例如:
add_months(trunc(sysdate, 'MM'),-12)
这里是隐式 to_char 的证明,如果你 to_date 已经是日期的东西,按照 Lalit 的要求 - 涉及 to_date(sysdate) 的基本查询的执行计划:
SQL_ID 3vs3gzyx2gtcn, child number 0
-------------------------------------
select * from dual where to_date(sysdate) < sysdate
Plan hash value: 3752461848
----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_DATE(TO_CHAR(SYSDATE@!))<SYSDATE@!)
你可以清楚地看到 TO_CHAR()
在过滤条件下。
关于php - 使用 add_months 时在 oracle 中不是有效月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141671/