sql >> Databáze >  >> RDS >> Oracle

Oracle:neplatný měsíc

1.

To_Date(To_Char(MaxDate, 'DD/MM/YYYY')) = REP_DATE

způsobuje problém. když použijete to_date bez formátu času, Oracle použije k převodu aktuální NLS formát relací, což ve vašem případě nemusí být "DD/MM/RRRR". Zkontrolujte toto...

SQL> select sysdate from dual;

SYSDATE
---------
26-SEP-12

Which means my session's setting is DD-Mon-YY

SQL> select to_char(sysdate,'MM/DD/YYYY') from dual;

TO_CHAR(SY
----------
09/26/2012


SQL> select to_date(to_char(sysdate,'MM/DD/YYYY')) from dual;
select to_date(to_char(sysdate,'MM/DD/YYYY')) from dual
               *
ERROR at line 1:
ORA-01843: not a valid month

SQL> select to_date(to_char(sysdate,'MM/DD/YYYY'),'MM/DD/YYYY') from dual;

TO_DATE(T
---------
26-SEP-12

2.

Ještě důležitější je, proč převádíte na znak a poté na datum, místo přímého porovnávání

MaxDate = REP_DATE

Pokud chcete před porovnáním ignorovat časovou složku v MaxDate, měli byste použít..

trunc(MaxDate ) = rep_date

místo toho.

==Aktualizace:na základě aktualizované otázky.

Rep_Date = 01/04/2009 Rep_Time = 01/01/1753 13:00:00

Myslím, že problém je složitější. pokud je rep_time zamýšlen jako pouze čas, nemůžete jej uložit do databáze jako datum. Musel by to být řetězec nebo datum na časový interval nebo numericky jako sekundy (díky Alexovi viz toto ). Pokud je to možné, navrhoval bych použít jeden sloupec rep_date, který obsahuje datum i čas, a porovnat jej přímo se sloupcem maximálního data.

Pokud je to běžící systém a nemáte kontrolu nad aktualizací, můžete zkusit toto.

trunc(rep_date) = trunc(maxdate) and 
to_char(rep_date,'HH24:MI:SS') = to_char(maxdate,'HH24:MI:SS')

V každém případě je čas ukládán nesprávně (jak můžete vidět z roku 1753) a v budoucnu mohou nastat další problémy.



  1. Proč mohu vytvořit tabulku s PRIMARY KEY ve sloupci s možnou hodnotou Null?

  2. Zobrazit den nebo datum jako sloupec v mysql

  3. Moje volání Ajax nefunguje – Snažím se naplnit jstree přes ajax php &mysql JSON

  4. Databáze PHP Neplatný argument zadaný pro foreach()