Data nemají formát – jsou interně reprezentována 7 nebo 8 bajtů . Tento klientský program (potenciálně) mu dá formát pouze tehdy, když je klientskému programu předáno datum.
Výchozí formát řetězce pro data v SQL/Plus nebo SQL Developer je nastaven pomocí NLS_DATE_FORMAT
parametr relace. Ostatní klienti budou mít obvykle parametry, které můžete nastavit pro výchozí formát data (pokud také nepoužívají NLS
nastavení). Dejte si však pozor na NLS_DATE_FORMAT
je parametr relace, takže patří k relaci uživatele a více uživatelů může mít každý jinou hodnotu parametru odpovídající tomu, jak jej nastavili.
Pokud chcete datu přiřadit konkrétní formát, budete jej muset převést na řetězec:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Proč váš dotaz nefunguje :
TO_DATE( value, frmt )
očekává hodnotu řetězce a masku formátu. Vnitřní TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
je dokonale platné a vrátí DATE '2016-05-01'
.
Nicméně vnější TO_DATE()
je pak předáváno DATE
typ, který jste právě vygenerovali, a formát řetězce (místo dvou očekávaných řetězců). Oracle implicitně zavolá TO_CHAR()
na datum a použijte NLS_DATE_FORMAT
parametr session jako masku formátu. Toto generuje řetězec z data a, vzhledem k chybě, z hodnoty NLS_DATE_FORMAT
není MM/DD/YYYY HH24:MI:SS
takže když vnější TO_DATE()
pokusí se analyzovat implicitně vytvořený řetězec selže, protože první číslo, které přečte, je po dobu jednoho měsíce neplatné.