Oracle
 sql >> база данни >  >> RDS >> Oracle

Не е валиден месец в Oracle, когато се използва add_months

Никога, ама никога не използвайте 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“, което е повече от вероятно стойността, на която е зададена вашата.

Ако всичко, което искате да направите, е да добавите_месеци към 1-во число на текущия месец, тогава трябва да използвате 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([email protected]!))<[email protected]!)

Можете ясно да видите TO_CHAR() в състояние на филтър.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL заявка за получаване на първата дата, в зависимост от текущата група (~ прекъсване на контрола)

  2. DeleteDatabase не се поддържа от доставчика, Oracle с Entity Framework

  3. PLS-00402:изисква се псевдоним в списъка SELECT на курсора, за да се избегнат дублирани имена на колони

  4. ORA-00942:Може ли да избира от schema.table, но не и таблица?

  5. В база данни на Oracle каква е разликата между ROWNUM и ROW_NUMBER?