Повторяющиеся значения 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;