Датите нямат формат - те се представят вътрешно чрез 7- или 8-байта . Едва когато дадена клиентска програма получи дата, тази клиентска програма (потенциално) й дава формат.
Форматът на низ по подразбиране за дати в SQL/Plus или SQL Developer се задава от NLS_DATE_FORMAT параметър на сесията. Други клиенти обикновено имат параметри, които можете да зададете за формата на датата по подразбиране (ако не използват също NLS настройки). Имайте предвид обаче, че NLS_DATE_FORMAT е параметър на сесията, така че принадлежи към сесията на потребителя и множество потребители могат да имат различна стойност за параметъра, съответстваща на това как са го задали.
Ако искате да дадете на дата конкретен формат, тогава ще трябва да я конвертирате в низ:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Защо вашата заявка не работи :
TO_DATE( value, frmt ) очаква стойност на низ и маска за формат. Вътрешният TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') е напълно валиден и ще върне DATE '2016-05-01' .
Външният TO_DATE() обаче след това се предава DATE тип, който току-що сте генерирали, и формата на низа (вместо двата низа, които очаква). Oracle ще извика неявно TO_CHAR() на датата и използвайте NLS_DATE_FORMAT параметър на сесията като маска на формат. Това генерира низ от датата и, предвид грешката, стойността на NLS_DATE_FORMAT не е MM/DD/YYYY HH24:MI:SS така че когато външният TO_DATE() се опитва да анализира неявно създадения низ, но не успява, тъй като първото число, което чете, е невалидно за един месец.