W bazie danych Oracle TO_TIMESTAMP()
funkcja konwertuje swój argument na wartość TIMESTAMP
typ danych.
Składnia
Składnia wygląda tak:
TO_TIMESTAMP(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 być w domyślnym formacie TIMESTAMP
typ danych, który jest określony przez NLS_TIMESTAMP_FORMAT
parametr inicjalizacji (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_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Wynik:
25/AUG/30 06:10:35.123456789 PM
Format wyniku jest określony przez NLS_TIMESTAMP_FORMAT
sesji parametr. Możemy sprawdzić wartość NLS_TIMESTAMP_FORMAT
parametr, wysyłając zapytanie do V$NLS_PARAMETERS
widok:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Wynik:
DD/MON/RR HH12:MI:SSXFF AM
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_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM
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_TIMESTAMP(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM
Kiedy to robisz, argument musi być w domyślnym formacie TIMESTAMP
typ danych, który jest określony przez NLS_TIMESTAMP_FORMAT
parametr inicjalizacji.
Oto przykład tego, co się dzieje, gdy przekazujemy wartość niezgodną z tym formatem:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Wynik:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
W tym przypadku przekazałem wartość, która używa czasu 24 godzin, ale mój NLS_TIMESTAMP_FORMAT
parametr określa zegar 12-godzinny z oznaczeniem AM/PM.
Aby to naprawić, musiałbym albo zmienić moje dane wejściowe, albo zmienić wartość NLS_TIMESTAMP_FORMAT
parametr.
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 TIMESTAMP
typ.
Przykład:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'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_TIMESTAMP(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM
Pamiętaj, że wynik jest nadal zwracany zgodnie z NLS_TIMESTAMP_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_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Wynik:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
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_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM
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_TIMESTAMP(null)
FROM DUAL;
Wynik:
null
Nieprawidłowa liczba argumentów
Wywołanie funkcji bez przekazywania jakichkolwiek argumentów skutkuje błędem:
SELECT TO_TIMESTAMP()
FROM DUAL;
Wynik:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
Jednak przekazywanie zbyt wielu argumentów nie wydaje się powodować żadnych problemów, o ile pierwsze trzy są prawidłowe:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English',
'Oops!',
'Dang!',
'Homer',
'Symptom'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM