Oracle
 sql >> Baza danych >  >> RDS >> Oracle

TO_TIMESTAMP_TZ() Funkcja w Oracle

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lokalna tabela tymczasowa w Oracle 10 (w zakresie procedury składowanej)

  2. Jak wywołać procedurę składowaną Oracle w Pythonie?

  3. Migracja bazy danych Oracle z AWS EC2 do AWS RDS, część 2

  4. Kroki zmiany hasła administratora, które zostało utracone lub zapomniane w domenie EBS WebLogic R12.2

  5. UPDATE z CASE i IN - Oracle