Daty nie mają formatu – są reprezentowane wewnętrznie przez 7 lub 8 bajtów . Tylko wtedy, gdy program klienta mija datę, ten program klienta (potencjalnie) nadaje mu format.
Domyślny format ciągu dla dat w SQL/Plus lub SQL Developer jest ustawiany przez NLS_DATE_FORMAT
parametr sesji. Inni klienci zazwyczaj mają parametry, które można ustawić dla domyślnego formatu daty (jeśli nie używają również NLS
ustawienia). Pamiętaj jednak, że NLS_DATE_FORMAT
jest parametrem sesji, więc należy do sesji użytkownika, a wielu użytkowników może mieć inną wartość parametru odpowiadającą temu, jak go ustawili.
Jeśli chcesz nadać dacie określony format, musisz przekonwertować ją na ciąg:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Dlaczego Twoje zapytanie nie działa :
TO_DATE( value, frmt )
oczekuje wartości ciągu i maski formatu. Wewnętrzny TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
jest całkowicie poprawny i zwróci DATE '2016-05-01'
.
Jednak zewnętrzna TO_DATE()
jest wtedy przekazywana DATE
typ, który właśnie wygenerowałeś i format ciągu (zamiast dwóch ciągów, których oczekuje). Oracle niejawnie wywoła TO_CHAR()
w dniu i użyj NLS_DATE_FORMAT
parametr sesji jako maska formatu. To generuje ciąg znaków od daty i, biorąc pod uwagę błąd, wartość NLS_DATE_FORMAT
nie jest MM/DD/YYYY HH24:MI:SS
więc gdy zewnętrzna TO_DATE()
próbuje przeanalizować niejawnie utworzony ciąg, który nie powiedzie się, ponieważ pierwsza odczytana liczba jest nieważna przez miesiąc.