В Oracle Database, TO_TIMESTAMP()
функцията преобразува своя аргумент в стойност на TIMESTAMP
тип данни.
Синтаксис
Синтаксисът е така:
TO_TIMESTAMP(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Знакът char
Аргументът може да бъде всеки израз, който се оценява до символен низ от CHAR
, VARCHAR2
, NCHAR
или NVARCHAR2
тип данни.
Незадължителният fmt
определя формата на char
. Ако пропуснете fmt
, след това char
трябва да е във формат по подразбиране на TIMESTAMP
тип данни, който се определя от NLS_TIMESTAMP_FORMAT
параметър за инициализация (вижте Как да проверите формата на датата на вашата сесия на Oracle).
Незадължителният 'nlsparam'
аргумент определя езика, на който са предоставени имената и съкращенията на месеците и дните. Приема следната форма:
'NLS_DATE_LANGUAGE = language'
Пример
Ето основен пример за демонстрация:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Резултат:
25/AUG/30 06:10:35.123456789 PM
Форматът на резултата се определя от NLS_TIMESTAMP_FORMAT
на вашата сесия параметър. Можем да проверим стойността на NLS_TIMESTAMP_FORMAT
параметър чрез заявка за V$NLS_PARAMETERS
изглед:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Резултат:
DD/MON/RR HH12:MI:SSXFF AM
Стойността по подразбиране на NLS_TIMESTAMP_FORMAT
параметърът е извлечен от NLS_TERRITORY
параметър. В моя случай NLS_TERRITORY
параметърът е AUSTRALIA
.
Ето какво се случва, когато променя NLS_TERRITORY
параметър към друга територия, след което извикайте TO_TIMESTAMP()
отново:
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;
Резултат:
25-AUG-30 06.10.35.123456789 PM
Този път резултатът се връща в различен формат.
Като алтернатива можете да промените стойността на NLS_TIMESTAMP_FORMAT
параметър директно. Това ще промени този параметър, без да засяга други параметри. Вижте Как да промените формата на датата във вашата сесия на Oracle за повече информация и примери.
Формат по подразбиране
В този пример пропускам fmt
аргумент:
SELECT
TO_TIMESTAMP(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Резултат:
25-AUG-30 06.10.35.123456789 PM
Когато правите това, аргументът трябва да е във формат по подразбиране на TIMESTAMP
тип данни, който се определя от NLS_TIMESTAMP_FORMAT
параметър за инициализация.
Ето пример за това какво се случва, когато предадем стойност, която не отговаря на този формат:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Резултат:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
В този случай предадох стойност, която използва 24-часово време, но моят NLS_TIMESTAMP_FORMAT
параметърът определя 12-часов часовник с обозначение AM/PM.
За да поправя това, ще трябва или да променя моя вход, или да променя стойността на NLS_TIMESTAMP_FORMAT
параметър.
Предоставете стойност по подразбиране при грешка при преобразуване
Също така имате възможност да предоставите стойност, която да се върне, в случай че има грешка при преобразуването на аргумента в TIMESTAMP
тип.
Пример:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Резултат:
null
В този случай посочих, че null
трябва да се връща всеки път, когато има грешка при преобразуване.
По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null
възниква в резултат на SQL SELECT
изявление.
Можете обаче да използвате SET NULL
за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null
трябва да бъдат върнати.
'nlsparam'
Аргумент
Незадължителният 'nlsparam'
аргумент определя езика, на който са предоставени имената и съкращенията на месеците и дните. Приема следната форма:
'NLS_DATE_LANGUAGE = language'
Пример
SELECT
TO_TIMESTAMP(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Резултат:
25-AUG-30 06.10.35.123456789 PM
Имайте предвид, че резултатът все още се връща според NLS_TIMESTAMP_FORMAT
на текущата сесия параметър. Просто входът беше на различен език.
Ето какво се случва, когато променя agosto
до August
докато използвате същия 'nlsparam'
стойност:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Резултат:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
Това се случи, защото не предоставих датата на езика, посочен от 'nlsparam'
аргумент (испански).
Променете го на English
решава този проблем:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Резултат:
25-AUG-30 06.10.35.123456789 PM
Вижте как да върнете списък с поддържани езици в Oracle, ако това помага.
Нулеви аргументи
Предаването на null
води до null
:
SET NULL 'null';
SELECT
TO_TIMESTAMP(null)
FROM DUAL;
Резултат:
null
Невалиден брой аргументи
Извикването на функцията без предаване на аргументи води до грешка:
SELECT TO_TIMESTAMP()
FROM DUAL;
Резултат:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
Предаването на твърде много аргументи обаче изглежда не създава проблеми, стига първите три да са валидни:
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;
Резултат:
25-AUG-30 06.10.35.123456789 PM