Oracle
 sql >> база данни >  >> RDS >> Oracle

Функция TO_TIMESTAMP_TZ() в Oracle

В Oracle Database, TO_TIMESTAMP_TZ() функцията преобразува своя аргумент в стойност на TIMESTAMP WITH TIME ZONE тип данни.

Синтаксис

Синтаксисът е така:

TO_TIMESTAMP_TZ(char [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

Знакът char Аргументът може да бъде всеки израз, който се оценява до символен низ от CHAR , VARCHAR2 , NCHAR или NVARCHAR2 тип данни.

Незадължителният fmt Аргументът указва формата на char . Ако пропуснете fmt , след това char трябва да е във формат по подразбиране на TIMESTAMP WITH TIME ZONE тип данни, който се определя от NLS_TIMESTAMP_TZ_FORMAT параметър за инициализация (вижте Как да проверите формата на датата на вашата сесия на Oracle).

Незадължителният 'nlsparam' аргумент определя езика, на който са предоставени имената и съкращенията на месеците и дните. Приема следната форма:

'NLS_DATE_LANGUAGE = language'

Пример

Ето основен пример за демонстрация:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Резултат:

25/AUG/30 06:10:35.123456789 PM +09:30

Форматът на резултата се определя от NLS_TIMESTAMP_TZ_FORMAT на вашата сесия параметър. Можем да проверим стойността на NLS_TIMESTAMP_TZ_FORMAT параметър чрез заявка за V$NLS_PARAMETERS изглед:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';

Резултат:

DD/MON/RR HH12:MI:SSXFF AM TZR

Стойността по подразбиране на NLS_TIMESTAMP_TZ_FORMAT параметърът е извлечен от NLS_TERRITORY параметър. В моя случай NLS_TERRITORY параметърът е AUSTRALIA .

Ето какво се случва, когато променя NLS_TERRITORY параметър към друга територия, след което извикайте TO_TIMESTAMP_TZ() отново:

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;

Резултат:

25-AUG-30 06.10.35.123456789 PM +09:30

Този път резултатът се връща в различен формат.

Като алтернатива можете да промените стойността на NLS_TIMESTAMP_TZ_FORMAT параметър директно. Това ще промени този параметър, без да засяга други параметри. Вижте Как да промените формата на датата във вашата сесия на Oracle за повече информация и примери.

Формат по подразбиране

В този пример пропускам fmt аргумент:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-AUG-30 06.10.35.123456789 PM +09:30'
    )
FROM DUAL;

Резултат:

25-AUG-30 06.10.35.123456789 PM +09:30

Когато правите това, аргументът трябва да бъде във формата по подразбиране на TIMESTAMP WITH TIME ZONE тип данни, който се определя от NLS_TIMESTAMP_TZ_FORMAT параметър.

Ето пример за това какво се случва, когато предадем стойност, която не отговаря на този формат:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30'
    )
FROM DUAL;

Резултат:

Error report -
ORA-01849: hour must be between 1 and 12

В този случай предадох стойност, която използва 24-часово време, но моят NLS_TIMESTAMP_TZ_FORMAT параметърът определя 12-часов часовник с обозначение AM/PM.

За да поправя това, ще трябва или да променя моя вход, или да променя стойността на NLS_TIMESTAMP_TZ_FORMAT параметър.

Предоставете стойност по подразбиране при грешка при преобразуване

Също така имате възможност да предоставите стойност, която да се върне в случай, че има грешка при преобразуването на аргумента в TIMESTAMP WITH TIME ZONE тип.

Пример:

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(
    'Oops!'
    DEFAULT null ON CONVERSION ERROR
    )
FROM DUAL;

Резултат:

null

В този случай посочих, че null трябва да се връща всеки път, когато има грешка при преобразуване. Връщаната стойност може да бъде израз или променлива за свързване и трябва да се изчисли до низ от символи CHAR , VARCHAR2 , NCHAR или NVARCHAR2 тип данни или null . След това функцията го преобразува в TIMESTAMP WITH TIME ZONE . Ако възникне грешка по време на това преобразуване, тогава се връща грешка.

По отношение на първия ред в горния пример, това е просто за уточняване какво трябва да се връща на моя клиент всеки път, когато null възниква стойност. По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null възниква в резултат на SQL SELECT изявление.

Можете обаче да използвате SET NULL за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null трябва да бъдат върнати.

'nlsparam' Аргумент

Незадължителният 'nlsparam' аргумент определя езика, на който са предоставени имената и съкращенията на месеците и дните. Приема следната форма:

'NLS_DATE_LANGUAGE = language'

Пример

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;

Резултат:

25-AUG-30 06.10.35.123456789 PM +02:00

Имайте предвид, че резултатът все още се връща според NLS_TIMESTAMP_TZ_FORMAT на текущата сесия параметър. Просто входът беше на различен език.

Ето какво се случва, когато променя agosto до August докато използвате същия 'nlsparam' стойност:

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;

Резултат:

Error report -
ORA-01843: not a valid month

Това се случи, защото не предоставих датата на езика, посочен от 'nlsparam' аргумент (испански).

Променете го на English решава този проблем:

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;

Резултат:

25-AUG-30 06.10.35.123456789 PM +02:00

Вижте как да върнете списък с поддържани езици в Oracle, ако това помага.

Нулеви аргументи

Предаването на null води до null :

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(null)
FROM DUAL;

Резултат:

null

Невалиден брой аргументи

Извикването на функцията без предаване на аргументи води до грешка:

SELECT TO_TIMESTAMP_TZ()
FROM DUAL;

Резултат:

Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"

Предаването на твърде много аргументи обаче изглежда не създава проблеми, стига първите три да са валидни:

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;

Резултат:

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. JDBC ResultSet получава колони с псевдоним на таблица

  2. Как да се върнете назад, когато възникне грешка при изпълнение на командата за зареждане на sql?

  3. Как да преминете през разделен списък в Oracle PLSQL

  4. DB Control наближава смъртта си

  5. Как да преместите файл от една директория в друга с помощта на PL SQL