W bazie danych Oracle TO_TIMESTAMP_TZ()
funkcja konwertuje swój argument na wartość TIMESTAMP WITH TIME ZONE
typ danych.
Składnia
Składnia wygląda tak:
TO_TIMESTAMP_TZ(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
argument określa format char
. Jeśli pominiesz fmt
, a następnie char
musi mieć domyślny format TIMESTAMP WITH TIME ZONE
typ danych, który jest określony przez NLS_TIMESTAMP_TZ_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_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL;
Wynik:
25/AUG/30 06:10:35.123456789 PM +09:30
Format wyniku jest określony przez NLS_TIMESTAMP_TZ_FORMAT
sesji parametr. Możemy sprawdzić wartość NLS_TIMESTAMP_TZ_FORMAT
parametr, wysyłając zapytanie do V$NLS_PARAMETERS
widok:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';
Wynik:
DD/MON/RR HH12:MI:SSXFF AM TZR
Domyślna wartość NLS_TIMESTAMP_TZ_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_TZ()
ponownie:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM +09:30
Tym razem wynik zwracany jest w innym formacie.
Alternatywnie możesz zmienić wartość NLS_TIMESTAMP_TZ_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_TZ(
'25-AUG-30 06.10.35.123456789 PM +09:30'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM +09:30
Kiedy to robisz, argument musi być w domyślnym formacie TIMESTAMP WITH TIME ZONE
typ danych, który jest określony przez NLS_TIMESTAMP_TZ_FORMAT
parametr.
Oto przykład tego, co się dzieje, gdy przekazujemy wartość niezgodną z tym formatem:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30'
)
FROM DUAL;
Wynik:
Error report - ORA-01849: hour must be between 1 and 12
W tym przypadku przekazałem wartość, która używa czasu 24 godzin, ale mój NLS_TIMESTAMP_TZ_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_TZ_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 konwersji argumentu na TIMESTAMP WITH TIME ZONE
typ.
Przykład:
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Wynik:
null
W tym przypadku określiłem, że null
należy zwracać, gdy wystąpi błąd konwersji. Wartość zwracana może być wyrażeniem lub zmienną powiązaną i musi być wynikiem ciągu znaków CHAR
, VARCHAR2
, NCHAR
lub NVARCHAR2
typ danych lub null
. Funkcja następnie konwertuje go na TIMESTAMP WITH TIME ZONE
. Jeśli podczas tej konwersji wystąpi błąd, zostanie zwrócony błąd.
Jeśli chodzi o pierwszą linię w powyższym przykładzie, jest to po prostu określenie, co powinno zostać zwrócone mojemu klientowi, gdy null
pojawia się wartość. 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_TZ(
'25-agosto-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM +02:00
Pamiętaj, że wynik jest nadal zwracany zgodnie z NLS_TIMESTAMP_TZ_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_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'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_TIMESTAMP_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM +02:00
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_TZ(null)
FROM DUAL;
Wynik:
null
Nieprawidłowa liczba argumentów
Wywołanie funkcji bez przekazywania jakichkolwiek argumentów skutkuje błędem:
SELECT TO_TIMESTAMP_TZ()
FROM DUAL;
Wynik:
Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
Jednak przekazywanie zbyt wielu argumentów nie wydaje się powodować żadnych problemów, o ile pierwsze trzy są prawidłowe:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English',
'Oops!',
'Dang!',
'Homer',
'Symptom'
)
FROM DUAL;
Wynik:
25-AUG-30 06.10.35.123456789 PM +09:30