Датите нямат формат - те се представят вътрешно чрез 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()
се опитва да анализира неявно създадения низ, но не успява, тъй като първото число, което чете, е невалидно за един месец.