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

TO_TIMESTAMP() Funkcja w Oracle

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekazać parametr logiczny do procedury Oracle C#

  2. Oracle DateTime w klauzuli Where?

  3. .NET / Oracle:Jak programowo wykonać skrypt z instrukcjami DDL

  4. Czy ograniczenia klucza obcego wpływają na przekształcenia zapytań w Oracle?

  5. Wymuszaj ograniczenie klucza obcego do kolumn tej samej tabeli