to_Char (DATE) со временем - PullRequest
       2

to_Char (DATE) со временем

0 голосов
/ 12 сентября 2018

У меня есть БД (Oracle Database 11g Enterprise Edition, выпуск 11.2.0.4.0 - 64-битная версия). Там есть таблица (курс), в которой у меня есть столбец Дата (start_dte). Я хочу отформатировать вывод в char, поэтому я использовал:

SELECT start_dte,
   to_Char(start_dte) AS start_dte_2,
   to_Char(start_dte,'DD.MM.YYYY') AS start_dte_3,
   to_Char(start_dte,'DD.MM.YYYY HH24:MI:SS') AS start_dte_4,
   to_Char(start_dte,'DD.MM.YYYY HH12:MI:SS') AS start_dte_5,
   to_Char(start_dte,'DD.MM.YYYY HH.MI.SSXFF AM') AS start_dte_6,
   to_Char(start_dte,'DD.MM.YYYY HH24:MI:SSxFF') AS start_dte_7,
   to_Char(start_dte,'DD-MON-YYYY HH24:MI:SSxFF TZH:TZM') AS start_dte_8
FROM Course

Результаты:

enter image description here

Номер 6,7,8 дай мне

java.sql.SQLException: ORA-01821: формат даты не распознан

6 имеет тот же формат, что и:

SELECT value
  FROM V$NLS_PARAMETERS
 WHERE parameter = 'NLS_TIME_FORMAT' 

enter image description here

7 и 8 взяты из документации Oracle, но это только для отметок времени. Так чего мне не хватает? Я знаю, что фактический тип данных должен быть datetime, но у меня есть доступ только для чтения к этой БД Что бы я хотел на самом деле:

enter image description here

Или еще лучше:

enter image description here

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

A DATE не имеет никакой информации о часовом поясе, поэтому, если вы хотите настроить отображаемое время, вам нужно будет указать, какой часовой пояс номинально представляет эта дата, и в какой часовой пояс вы хотите преобразовать ее в.

Например, если ваша сохраненная дата представляет собой UTC, и вы хотите увидеть эквивалентное местное время в Париже, вы можете указать, что сохраненное время указано в UTC, приведя его в качестве простой метки времени и передав ее в функция from_tz() ;а затем укажите целевой часовой пояс с помощью at:

-- CTE for your sample data
with course (start_dte) as (
  select cast(timestamp '2018-10-17 14:00:00' as date) from dual
)
-- actual query
select from_tz(cast(start_dte as timestamp), 'UTC')
  at time zone 'Europe/Paris' as start_timestamp_tz
from course;

START_TIMESTAMP_TZ                        
------------------------------------------
2018-10-17 16:00:00.000000000 EUROPE/PARIS

Поскольку вы запрашиваете это через JDBC, вы, вероятно, захотите получить его как его собственный тип данных, а затем выбрать способотображать это локально.(Но вы, вероятно, могли бы запросить его как дату и настроить его также на Java ...)

Если вы хотите преобразовать его в строку на стороне БД, просто используйте модель формата, которую вы уже использовали:

select to_char(from_tz(cast(start_dte as timestamp), 'UTC')
  at time zone 'Europe/Paris', 'DD.MM.YYYY HH24:MI') as start_date
from course;

START_DATE      
----------------
17.10.2018 16:00

Также легко получить его в два поля, и если вы не хотите повторять преобразование, вы можете использовать CTE или встроенное представление:

select to_char(start_timestamp_tz, 'DD.MM.YYYY') as start_date,
  to_char(start_timestamp_tz, 'HH24:MI') as start_time
from (
  select from_tz(cast(start_dte as timestamp), 'UTC')
    at time zone 'Europe/Paris' as start_timestamp_tz
  from course
);


START_DATE START_TIME
---------- ----------
17.10.2018 16:00     

НоПохоже, что Java должна делать это преобразование в строки для отображения.

0 голосов
/ 12 сентября 2018

Что бы я на самом деле хотел:

| START_DATE       |
|------------------|
| 17.10.2018 16:00 |

Или даже лучше:

| START_DATE | START_TIME |
|------------|------------|
| 17.10.2018 |      16:00 |

Использование:

SELECT to_Char(start_dte,'DD.MM.YYYY') AS start_date,
       to_Char(start_dte,'HH24:MI') AS start_time
FROM   Course

Если вашданные хранятся в таблице в одном часовом поясе (то есть в формате UTC), и вы хотите, чтобы они были в другом часовом поясе, а затем используйте:

  • CAST( date_value AS TIMESTAMP ), чтобы преобразовать их из типа данных DATE в TIMESTAMP тип данных.
  • FROM_TZ( timestamp_value, timezone_string ) для преобразования его из типа данных TIMESTAMP в тип данных TIMESTAMP WITH TIME ZONE в заданном часовом поясе.
  • timestamp_with_timezone_value AT TIME ZONE timezone_string для преобразования его изодин часовой пояс к другому часовому поясу.

Как это:

SELECT TO_CHAR(
         FROM_TZ( CAST( start_dte AS TIMESTAMP ), 'UTC' ) AT TIME ZONE 'Europe/Berlin',
         'DD.MM.YYYY'
       ) AS start_date,
       TO_CHAR(
         FROM_TZ( CAST( start_dte AS TIMESTAMP ), 'UTC' ) AT TIME ZONE 'Europe/Berlin',
         'HH24:MI'
       ) AS start_time
FROM   Course
0 голосов
/ 12 сентября 2018

start_dte - это значение DATE.

DATE не имеет ни доли секунды (т. Е. XFF), ни информации о часовом поясе (т. Е. TZH:TZM)

Используйте TIMESTAMP WITH TIME ZONE, если вы хотите получить такой вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...