W bazie danych Oracle TO_DATE()
funkcja konwertuje swój argument na wartość DATE
typ danych.
Składnia
Składnia wygląda tak:
TO_DATE(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
char
argument może być dowolnym wyrażeniem, którego wynikiem jest ciąg znaków o wartości CHAR
, VARCHAR2
, NCHAR
lub NVARCHAR2
typ danych.
Opcjonalny fmt
określa format char
. Jeśli pominiesz fmt
, a następnie char
musi mieć domyślny format daty. Domyślny format daty jest określony przez NLS_DATE_FORMAT
parametr inicjalizacji, który sam jest domyślnie ustawiany przez NLS_TERRITORY
parametr, ale można go również ustawić jawnie (zobacz Jak sprawdzić format daty sesji Oracle).
Opcjonalny 'nlsparam'
argument określa język, w którym podawane są nazwy i skróty miesięcy i dni. Przybiera następującą formę:
'NLS_DATE_LANGUAGE = language'
Przykład
Oto podstawowy przykład do zademonstrowania:
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Wynik:
25/AUG/30
Format wyniku jest określony przez NLS_DATE_FORMAT
sesji parametr. Możemy sprawdzić wartość NLS_DATE_FORMAT
parametr, wysyłając zapytanie do V$NLS_PARAMETERS
widok:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Wynik:
DD/MON/RR
Domyślna wartość NLS_TIMESTAMP_FORMAT
parametr pochodzi z NLS_TERRITORY
parametr. W moim przypadku NLS_TERRITORY
parametr to AUSTRALIA
.
Oto, co się stanie, gdy zmienię NLS_TERRITORY
do innego terytorium, a następnie wywołaj TO_TIMESTAMP()
ponownie:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Wynik:
25-AUG-30
Tym razem wynik zwracany jest w innym formacie.
Alternatywnie możesz zmienić wartość NLS_TIMESTAMP_FORMAT
parametr bezpośrednio. Spowoduje to zmianę tego parametru bez wpływu na inne parametry. Zobacz Jak zmienić format daty w sesji Oracle, aby uzyskać więcej informacji i przykładów.
Format domyślny
W tym przykładzie pomijam fmt
argument:
SELECT
TO_DATE(
'25-AUG-30'
)
FROM DUAL;
Wynik:
25-AUG-30
Kiedy to robisz, argument musi być w domyślnym formacie DATE
typ danych, który jest określony przez NLS_DATE_FORMAT
parametr inicjalizacji.
Oto przykład tego, co się dzieje, gdy przekazujemy wartość niezgodną z tym formatem:
SELECT
TO_DATE(
'2030-08-25'
)
FROM DUAL;
Wynik:
Error report - ORA-01861: literal does not match format string
Aby to naprawić, musiałbym albo zmienić moje dane wejściowe, albo zmienić wartość NLS_DATE_FORMAT
parametr.
Pomijanie modelu formatu generalnie nie jest dobrą praktyką. Innymi słowy, dobrą praktyką jest zawsze dostarczanie modelu formatu podczas korzystania z tej funkcji. Oto pełna lista elementów formatu daty i godziny, których można użyć podczas konstruowania modelu formatu.
Podaj wartość domyślną w przypadku błędu konwersji
Masz również możliwość podania wartości do zwrócenia w przypadku wystąpienia błędu podczas konwertowania argumentu na DATE
typ.
Przykład:
SET NULL 'null';
SELECT
TO_DATE(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Wynik:
null
W tym przypadku określiłem, że null
powinien być zwracany w przypadku wystąpienia błędu konwersji.
Domyślnie SQLcl i SQL*Plus zwracają spację, gdy null
występuje w wyniku polecenia SQL SELECT
oświadczenie.
Możesz jednak użyć SET NULL
aby określić inny ciąg do zwrócenia. Tutaj określiłem, że ciąg null
należy zwrócić.
'nlsparam'
Argument
Opcjonalny 'nlsparam'
argument określa język, w którym podawane są nazwy i skróty miesięcy i dni. Przybiera następującą formę:
'NLS_DATE_LANGUAGE = language'
Przykład
SELECT
TO_DATE(
'25-agosto-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Wynik:
25-AUG-30
Zwróć uwagę, że wynik jest nadal zwracany zgodnie z NLS_DATE_FORMAT
bieżącej sesji parametr. Po prostu wejście był w innym języku.
Oto, co się stanie, gdy zmienię agosto
do August
używając tego samego 'nlsparam'
wartość:
SELECT
TO_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Wynik:
Error report - ORA-01843: not a valid month
Stało się tak, ponieważ nie podałem daty w języku określonym przez 'nlsparam'
argument (hiszpański).
Zmiana na English
rozwiązuje ten problem:
SELECT
TO_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Wynik:
25-AUG-30
Zobacz, jak zwrócić listę obsługiwanych języków w Oracle, jeśli to pomaga.
Argumenty zerowe
Przekazywanie null
wyniki w null
:
SET NULL 'null';
SELECT
TO_DATE(null)
FROM DUAL;
Wynik:
null
Nieprawidłowa liczba argumentów
Wywołanie funkcji bez przekazywania jakichkolwiek argumentów skutkuje błędem:
SELECT TO_DATE()
FROM DUAL;
Wynik:
SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
Przekazywanie zbyt wielu argumentów również skutkuje błędem:
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR',
'NLS_DATE_LANGUAGE = English',
'Gosh',
'Dang'
)
FROM DUAL;
Wynik:
SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function"