Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Niepoprawny miesiąc w Oracle, gdy używany jest add_months

Nigdy, przenigdy nie używaj TO_DATE() na czymś, co jest już DATE . Powodem tego jest to, że Oracle będzie musiał wykonać kilka niejawnych konwersji, aby spełnić Twoje życzenia:

TO_DATE(sysdate, 'mm-yyyy')

jest naprawdę prowadzony jako

TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')

więc jeśli twój nls_date_format jest ustawiony na coś innego niż „mm-rrrr”, będziesz mieć problemy. Domyślnym parametrem nls_date_format jest „DD-MON-RR”, co jest bardziej niż prawdopodobną wartością ustawioną przez Ciebie.

Jeśli wszystko, co chciałeś zrobić, to dodać_miesięcy do 1. dnia bieżącego miesiąca, powinieneś użyć TRUNC() , np.:

add_months(trunc(sysdate, 'MM'),-12)

Oto dowód na niejawne to_char, jeśli do_datujesz coś, co jest już datą, zgodnie z żądaniem Lalita - plan wykonania podstawowego zapytania obejmującego 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]!)

Możesz wyraźnie zobaczyć TO_CHAR() w stanie filtra.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę filtrować dane w sieci Apex, aby pokazać pewne rzeczy dla określonych grup użytkowników?

  2. Jaka jest różnica między ROWNUM a ROW_NUMBER w bazie danych Oracle?

  3. Łączenie Oracle za pomocą ODP.NET z Enterprise Library DAAB

  4. Obrót w Oracle 11g

  5. Podzapytania rekurencyjne z sortowaniem