gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:37:00 26 4
gpt4 key购买 nike

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

    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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com