powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Корректная обработка TIMESTAMP
25 сообщений из 30, страница 1 из 2
Корректная обработка TIMESTAMP
    #40093243
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Есть тег, похожий на TIMESTAMP, в котором приходит дата и время.
Код: xml
1.
<DAT_ABC>2021-06-08T16:17:12.341</DAT_ABC>


В функции XMLTABLE в предложении COLUMNS я его интерпретирую как TIMESTAMP WITH TIME ZONE
Код: plsql
1.
LOAD_TO_ABC_DATE   TIMESTAMP WITH TIME ZONE     PATH 'DAT_ABC',


а в инструкции SELECT преобразую к типу DATE, так как хочу записать в столбец таблицы, который имеет тип DATE
Код: plsql
1.
, CAST (LOAD_TO_ABC_DATE AS DATE) LOAD_TO_ABC_DATE



Итоговая конструкция получается такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
INSERT INTO TABLE1
SELECT
...
, CAST (LOAD_TO_ABC_DATE AS DATE) LOAD_TO_ABC_DATE
FROM XMLTABLE(
...
COLUMNS 
...
LOAD_TO_ABC_DATE   TIMESTAMP WITH TIME ZONE     PATH 'DAT_ABC',
...
)



Но возникает ошибка
ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ

Как сделать, чтобы парсинг и инсерт проходили успешно?
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093247
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В XSD элемент описан так:
Код: xml
1.
<xs:element name="DAT_ABC" type="xs:dateTime" nillable="true">
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093250
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093260
Hammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  FUNCTION DSDecodeDate(pdate IN varchar2) RETURN date AS
    lvdate date;
  BEGIN
    -- 2021-04-03T12:54:00
    lvdate := NULL;
    IF (Length(nvl(pdate, '')) > 0)
      AND (pdate IS NOT NULL) THEN
      lvdate := to_date(pdate, 'yyyy-mm-dd"T"hh24:mi:ss');
    END IF;
    RETURN lvdate;
  END DSDecodeDate;


Не?
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093263
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ultrasonic7,

покажите пример, у меня, например, проблема не воспроизводится:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select 
 DAT_ABC a, cast(DAT_ABC as date) b
from xmltable(
         '/A'
         passing xmltype('<A><DAT_ABC>2021-06-08T16:17:12.341</DAT_ABC></A>')
         columns
            DAT_ABC timestamp with time zone path 'DAT_ABC'
         );

A                                        B
---------------------------------------- -------------------
2021-06-08 16:17:12.341000 +03:00        2021-06-08 16:17:12

SQL> select version from v$instance;

VERSION
-----------------
11.2.0.4.0
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093264
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH XMLTEST(DATA) AS
     (SELECT XMLType('<TestData>
       <trade>
         <GenTest>
           <Id>IDVal</Id>
         </GenTest>
         <DateTest>
           <Date>2021-06-08T16:17:12.341</Date>
         </DateTest>
       </trade>
     </TestData>') data FROM dual
     )
SELECT 
    t.id
    ,to_timestamp(t.testdate,'YYYY-MM-DD"T"HH24:MI.SS.FF3') 
FROM XMLTEST xt
  ,XMLTable ('/TestData/trade'
  	  passing xt.data
  	  columns
  	  id      varchar2(10) path 'GenTest/Id',
  	  testdate  varchar2(24)          path 'DateTest/Date'
      ) t
;



TZ добавить по вкусу
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093271
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hammer
ultrasonic7,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  FUNCTION DSDecodeDate(pdate IN varchar2) RETURN date AS
    lvdate date;
  BEGIN
    -- 2021-04-03T12:54:00
    lvdate := NULL;
    IF (Length(nvl(pdate, '')) > 0)
      AND (pdate IS NOT NULL) THEN
      lvdate := to_date(pdate, 'yyyy-mm-dd"T"hh24:mi:ss');
    END IF;
    RETURN lvdate;
  END DSDecodeDate;



Не?

жесть, конечно, с '' и вообще с проверками...

ну, и в целом, ладно у автора 11й оракл, но сейчас есть TO_UTC_TIMESTAMP_TZ + "on conversion error" как у to_date/to_timestamp[_tz] так и у cast
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093275
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hammer,

ваш вариант не работает, к сожалению.

Код: plsql
1.
select DSDecodeDate ('2021-06-08T16:17:12.341') from dual;



Выдаёт ошибку:
[Error] Execution (1: 8): ORA-01830: шаблон формата даты завершается перед преобразованием всей строки ввода

Есть ещё и дробные части секунд, их надо отбросить.
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093276
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sayan Malakshinov,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select 
 DAT_ABC a, cast(DAT_ABC as date) b
from xmltable(
         '/A'
         passing xmltype('<A><DAT_ABC>2021-06-08T16:17:12.341</DAT_ABC></A>')
         columns
            DAT_ABC timestamp with time zone path 'DAT_ABC'
         );




та же ошибка выдаётся

ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093280
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,
мне надо к типу не TIMESTAMP, а DATE
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093281
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

У Вас varchar, сделайте to_date
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093284
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH XMLTEST(DATA) AS
     (SELECT XMLType('<TestData>
       <trade>
         <GenTest>
           <Id>IDVal</Id>
         </GenTest>
         <DateTest>
           <Date>2021-06-08T16:17:12.341</Date>
         </DateTest>
       </trade>
     </TestData>') data FROM dual
     )
SELECT 
    t.id
    ,to_date(t.testdate,'YYYY-MM-DD"T"HH24:MI.SS.FF3') 
FROM XMLTEST xt
  ,XMLTable ('/TestData/trade'
      passing xt.data
      columns
      id      varchar2(10) path 'GenTest/Id',
      testdate  varchar2(100 char)          path 'DateTest/Date'
      ) t
;



[Error] Execution (15: 25): ORA-01821: формат даты не распознан

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH XMLTEST(DATA) AS
     (SELECT XMLType('<TestData>
       <trade>
         <GenTest>
           <Id>IDVal</Id>
         </GenTest>
         <DateTest>
           <Date>2021-06-08T16:17:12.341</Date>
         </DateTest>
       </trade>
     </TestData>') data FROM dual
     )
SELECT 
    t.id
    ,to_date(t.testdate,'YYYY-MM-DD"T"HH24:MI.SS') 
FROM XMLTEST xt
  ,XMLTable ('/TestData/trade'
      passing xt.data
      columns
      id      varchar2(10) path 'GenTest/Id',
      testdate  varchar2(100 char)          path 'DateTest/Date'
      ) t
;



[Error] Execution (15: 14): ORA-01830: шаблон формата даты завершается перед преобразованием всей строки ввода
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093288
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7

Есть ещё и дробные части секунд, их надо отбросить.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> ed
Wrote file afiedt.buf

  1* select to_timestamp('2021-06-08T16:17:12.341','yyyy-mm-dd"T"hh24:mi:ss.ff3') d from dual
SQL> /

D
---------------------------------------------------------------------------
08.06.2021 16:17:12.341000000

Session altered.

SQL> select cast(to_timestamp('2021-06-08T16:17:12.341','yyyy-mm-dd"T"hh24:mi:ss.ff3') as date) d from dual;

D
-------------------
08.06.2021 16:17:12



.....
stax
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093378
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Код: plsql
1.
select cast(to_timestamp('2021-06-08T16:17:12.341','yyyy-mm-dd"T"hh24:mi:ss.ff3') as date) d from dual;



Вот этот вариант работает.
Только почему остальные варианты на моей машине не работали, когда у других они работали? Может, дело в параметрах сессии на моей машине или в каком-то параметре реестра?
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093383
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
SELECT * FROM NLS_SESSION_PARAMETERS;


Вот параметры моей сессии:

параметры сессииNLS_LANGUAGE RUSSIAN
NLS_TERRITORY RUSSIA
NLS_CURRENCY р.
NLS_ISO_CURRENCY RUSSIA
NLS_NUMERIC_CHARACTERS ,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD.MM.RR
NLS_DATE_LANGUAGE RUSSIAN
NLS_SORT RUSSIAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY р.
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

Мне еще сказали, чтобы в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\oracle\KEY_OraClient11g_home1
посмотреть параметр NLS_LANG
Он установлен в AMERICAN_AMERICA.WE8MSWIN1252

А у вас какие настройки, уважаемые участники форума?
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093424
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,
Мессир, крайне порочная практика рассчитывать на NLS настройки клиента
Это так называемая NLS Bomb
пишите NLS независимый код
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093467
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

так я разве сказал, что рассчитывать на NLS настройки клиента это хорошая идея?

И как его писать, NLS независимый код?
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093495
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

Если кратко, явно указывать format mask если нужно преобразования string -> date/number
И вообще следить за преобразованиями типов

Давай по пунктам:
Пример что у Вас не работало, и работало у других
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093744
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,
Собственно, не работал запрос, указанный в начале темы, который отлично работал у других. После определённых танцев с бубном он заработал. А писать код в другом стиле мне нельзя, потому что у меня на работе есть определённые правила написания кода. И код, который я пишу, на машинах других сотрудников работает. И вот сейчас, когда проблема решена, мне нужно проверить одно предположение. Хочу попросить Вас, а также Hammer, Sayan Malakshinov, Stax найти время, чтобы отыскать в реестре параметр NLS_LANG. Обычно он находится в ветке HKEY_LOCAL_MACHINE\SOFTWARE\oracle\KEY_OraClient11g_home1. Но может находиться и в других ветках. В этом случае можно воспользоваться поиском по реестру параметра NLS_LANG. Скажите, пожалуйста, какое значение имеет этот параметр?
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093747
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7
А писать код в другом стиле мне нельзя, потому что у меня на работе есть определённые правила написания кода.


UKRAINIAN_UKRAINE.CL8MSWIN1251

.....
stax
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093751
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
спасибо!
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093757
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

непонятно чем Вас не устраивает 22364235

или у Вашем стиле запрещено указывать маску?

нужна дата, приведите timestamp к дате

или сразу,напр ,to_date(substr(t.testdate,1,19),'YYYY-MM-DD"T"HH24:MI.SS') d

ps
обратите внимание и на
NLS_TIMESTAMP_FORMAT/NLS_TIMESTAMP_FORMAT

.....
stax
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093759
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А у других форумчан этот параметр какой?
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093760
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Да, есть некие корпоративные правила, которые запрещают указывать маску. Меня просили, к каком стиле написать - будь добр написать.
...
Рейтинг: 0 / 0
Корректная обработка TIMESTAMP
    #40093762
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сейчас говорю про данный конкретный случай. В других случаях маска используется. Зашиваем её в константу, и всё.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Корректная обработка TIMESTAMP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]