Преобразование Varchar в ЛЮБОЙ формат времени

#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') возвращает datetime

2. Всегда ли в ваших строках четыре символа (т. Е. С добавлением нуля, например, ‘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 выдает мне ошибку «нечисловой символ был найден там, где ожидалось числовое значение», но я могу отследить это и исправить. Это именно тот формат, который я искал. Спасибо!