преобразовать строку в oracle sql отметка времени Пн 19 августа 2019 08:21:48 GMT-0700 (PDT) - PullRequest
0 голосов
/ 14 февраля 2020

Greeting Community.

Я видел похожие примеры в Java, но как нам это сделать SQL в частности Oracle. Сейчас я просто делаю то, что работает, потому что мы находимся в часовом поясе PDT.

-Благодарю за помощь!

with xx as ( 
select replace('Mon Aug 19 2019 08:21:48 GMT-0700 (PDT)',' GMT-0700 (PDT)','') as dt from dual

)

select to_date(dt,'DY MON DD YYYY HH24:MI:SS') from xx

1 Ответ

2 голосов
/ 14 февраля 2020

Вводят временную метку с часовым поясом. Он имеет избыточную информацию о часовом поясе; часть этого должна быть убрана. Например, если вы решите доверять PDT и игнорировать смещение по Гринвичу, вы можете сделать что-то вроде этого:

with xx as ( 
select regexp_replace('Mon Aug 19 2019 08:21:48 GMT-0700 (PDT)','GMT-\d{4} \(|\)') 
       as str_ts_with_tz 
from   dual
)
select to_timestamp_tz(str_ts_with_tz,'Dy Mon DD YYYY HH24:MI:SS TZD') 
       as oracle_ts_with_tz 
from   xx
;



ORACLE_TS_WITH_TZ                      
---------------------------------------
2019-08-19 08:21:48 America/Los_Angeles

Обратите внимание, что результирующий тип данных - это отметка времени с часовым поясом . При необходимости вы можете использовать это как метку времени или как дату (просто отбрасывая информацию о часовом поясе); это простая операция, внутренняя для Oracle. Но это потеряет информацию; Дважды подумайте, прежде чем сделать это.

Обратите также внимание на то, что отметка времени представлена ​​в другом формате в моих выходных данных по сравнению с вашими данными. Это потому, что мой NLS_TIMESTAMP_TZ_FORMAT равен 'yyyy-mm-dd hh24:mi:ss tzr'.

Если вам интересно, почему вы должны сделать выбор (что означает «зачем вам сначала нужно удалить часть входной строки») относительно информация о часовом поясе: PDT просто не совпадает с GMT-0700. Может быть, летом, но не зимой. Oracle не примет такую ​​противоречивую ерунду как ввод своих функций. Либо это GMT-0700, либо PDT, это не может быть и то и другое. И вы не можете просто использовать REPLACE (не так просто, во всяком случае), потому что то, что должно быть заменено, может содержать переменные символы.

...