#oracle #oracle12c #cognos #cognos-10
#Oracle #oracle12c #cognos #cognos-10
Вопрос:
У меня есть столбец varchar begin_time
, который хранит 24-часовое время как varchar без форматирования времени, т. Е. 1330
Мне нужно преобразовать этот varchar в полезную временную метку, datetime и т. Д. где я могу легко преобразовать varchar в стандартный формат времени ( 1:30 PM
)
Тип конечного формата не имеет значения, если я могу преобразовать varchar в формат, который я могу преобразовать в стандартный формат.
Я пытался изучить приемы форматирования, специфичные для Cognos (эти функции предназначены для конструктора показателей, и я использую Report Studio), но безрезультатно. Методы, которые я нашел при поиске специфичных для oracle трюков, казались слишком запутанными (с использованием безумно длинных правил регулярных выражений) для того, что мне нужно.
Если мне нужно указать дату, я могу использовать столбец и добавить время переменной. start_date
Примечание: start_date
находится в date
формате
Пример
select
to_date('08/27/2018','MM/DD/YYYY') as start_date
, '1300' as begin_time
from dual
В конечном итоге мне нужно просто иметь возможность выводить время как 1:00 PM
Любая помощь будет оценена. Я бьюсь головой об стену по этому поводу… Я привык использовать проприетарные коды в течение определенного периода времени и не имею большого опыта работы с настоящими форматами даты и времени.
Обновления, отвечающие на вопросы
- Алекс Пул, я не утверждаю, что эта система лучшая… Это предоставляется поставщиком. 🙂
BEGIN_TIME
Всегда 4 символа- Похоже, я немного переусердствовал… Литтлфут, возможно, прибил его к голове, но, к сожалению, у меня не будет возможности проверить это до завтра.
Спасибо всем за быстрые ответы. У меня могут остаться волосы, когда этот запрос закончится сейчас 🙂
Последняя мысль
Мой урок, извлеченный из этого, прост: если вы имеете дело с форматами времени, не отказывайтесь от идеи использования функции формата даты.
Комментарии:
1. Я думаю, что вы слишком много думаете. Oracle может преобразовывать время так же, как даты, например,
to_date('08/27/2018 1300','MM/DD/YYYY hh24mi')
возвращает datetime2. Всегда ли в ваших строках четыре символа (т. Е. С добавлением нуля, например, ‘0123’)? Вы подаете в суд, что нет значений, которые на самом деле не представляют реальное время? (И почему вы вообще храните время отдельно !?)
3. Предполагая, что значения
begin_time
столбца всегда имеют длину 4 символа, вы можете просто использоватьSELECT TO_DATE(begin_time, 'HH24MI')
его для преобразования в значение даты / времени, а затем игнорировать часть даты (по умолчанию это будет сегодняшняя дата!) При форматировании для отображения.4. Это будет первый день текущего месяца, а не сегодня; как сказал Литтлфут * 😎
Ответ №1:
Ищете это?
SQL> with test (col) as
2 (select '1330' from dual)
3 select to_char(to_date(col, 'hh24mi'), 'hh:mi am') result
4 from test;
RESULT
--------
01:30 PM
SQL>
Что он делает?
-
TO_DATE
преобразует имеющуюся у вас строку (например,1330
) в допустимое значение ДАТЫ. По умолчанию это будет значение даты, усеченное до первого числа текущего месяца:SQL> alter session set nls_Date_format = 'dd.mm.yyyy hh24:Mi'; Session altered. SQL> select to_date('1330', 'hh24mi') res1 from dual; RES1 ---------------- 01.04.2019 13:30 SQL>
-
обращение
TO_CHAR
к нему, опять же с соответствующей маской формата, возвращает желаемый результат
Комментарии:
1. Спасибо всем за вашу помощь! Литтлфут прибил это к голове. Теперь Cognos выдает мне ошибку «нечисловой символ был найден там, где ожидалось числовое значение», но я могу отследить это и исправить. Это именно тот формат, который я искал. Спасибо!