Повторяющиеся значения AM или PM со временем в оракуле

У меня есть таблица с двумя столбцами даты: time_from,time_to.Both имеют тип данных date. Теперь я хочу объединить эти значения столбцов, так что я могу получить только раз, как это:

21:00 - 9:00.

Теперь, некоторые из моих времен находятся в AM, в то время как другие - PM, и я хочу написать оператор выбора, чтобы объединить их. Я написал это, но он не возвращает правильный "AM" или "PM" каждый раз.

Мой запрос:

select 
  to_char(time_from,'HH:MI:SS PM') || ' - ' || to_char(time_to,'HH:MI:SS PM')
from
  table-name

Я изначально вставил свое время в формате 12 часов.

Нужна помощь здесь, пожалуйста? Я не хочу жестко кодировать AM или PM

2 ответа

Теперь, некоторые из моих времен в AM, а другие в PM

ДАТА не хранится в базе данных так, как вы ее видите. То, что вы видите, предназначено только для того, чтобы мы могли его интерпретировать. Oracle хранит дату во внутреннем формате 7 байт, что является ее собственным форматом.

но это не возвращает "AM" или "PM" правильно каждый раз

Вам необходимо проверить ваши данные, так как TO_CHAR не манипулирует данными. Он будет отображать дату и время в желаемом формате.

Это зависит только от значения DATE в вашей таблице и не зависит от модели формата AM/PM в TO_CHAR.

-- setting nls_date_format only for the DATE value display

SQL> alter session set nls_date_format='MM/DD/YYYY HH:MI:SS PM';

Session altered.

Формат PM:

SQL> WITH DATA AS
  2    ( SELECT SYSDATE - 4/24 from_date, SYSDATE + 4/24 to_date FROM dual
  3    )
  4  SELECT from_date,
  5    to_date,
  6    TO_CHAR(from_date, 'HH:MI PM')
  7    ||' - '
  8    ||TO_CHAR(to_date, 'HH:MI PM') my_tm_format
  9  FROM DATA;

FROM_DATE              TO_DATE                MY_TM_FORMAT
---------------------- ---------------------- -------------------
11/12/2015 07:39:05 AM 11/12/2015 03:39:05 PM 07:39 AM - 03:39 PM

AM формат:

SQL> WITH DATA AS
  2    ( SELECT SYSDATE - 4/24 from_date, SYSDATE + 4/24 to_date FROM dual
  3    )
  4  SELECT from_date,
  5    to_date,
  6    TO_CHAR(from_date, 'HH:MI AM')
  7    ||' - '
  8    ||TO_CHAR(to_date, 'HH:MI AM') my_tm_format
  9  FROM DATA;

FROM_DATE              TO_DATE                MY_TM_FORMAT
---------------------- ---------------------- -------------------
11/12/2015 07:39:14 AM 11/12/2015 03:39:14 PM 07:39 AM - 03:39 PM

ПРИМЕЧАНИЕ:

Предложение WITH предназначено только для создания примера данных для демонстрации. Используйте следующий запрос с вашей таблицей, который совпадает с тем, который вы используете в настоящее время. Дело в том, что вам нужно проверить ваши данные, поскольку TO_CHAR не манипулирует данными.

SELECT from_date,
  to_date,
  TO_CHAR(from_date, 'HH:MI PM')
  ||' - '
  ||TO_CHAR(to_date, 'HH:MI PM') my_tm_format
FROM your_table;

TO_CHAR способен преобразовывать элемент времени в 12-часовой формат независимо от модели формата, которую вы указываете для элемента времени.

В соответствии с желаемым результатом (без нуля в начале) это должно быть так:

SELECT 
  TO_CHAR(time_from, 'fmHH:')||TO_CHAR(time_from, 'MI PM') || ' - ' ||
  TO_CHAR(to_from, 'fmHH:')||TO_CHAR(to_from, 'MI PM')
FROM table_name;

или же

SELECT 
  REGEXP_REPLACE(TO_CHAR(time_from, 'HH:MI PM'), '^0') || ' - ' ||
  REGEXP_REPLACE(TO_CHAR(to_from,'HH:MI PM'), '^0')
FROM table_name;
Другие вопросы по тегам