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