php - 使用 add_months 时在 oracle 中不是有效月份

标签 php sql oracle to-date sysdate

我在查询中给出了以下代码。

    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/

相关文章:

php - 数据库中的 UTF8 无法正确显示(Codeigniter)

mysql - 批量插入/更新mysql

达到 Oracle XE 数据限制 - 如何减小表空间大小?

javascript - 无法在特定站点中使用我的 NightmareJS v2 脚本登录。我收到 Oracle 错误

sql - Oracle SQL : Is it possible using SUBSTR and INSTR to return ALL Strings in a given text field?

javascript - 如何在javascript中检查php数组的长度

php - CSS边框比图片大

php - $_Session "complication"登录和注销 php

android - 哪些字符不能用于 SQLite 数据库中的值?

c# - 尝试使用 SQL 将数据插入数据库时​​出现 "Invalid column name"