2016-09-26 5 views
0

У меня есть столбец acdtime, который дает мне время по вызову секунд. Мне нужно преобразовать эти поля в формат HH: MM.Преобразование из интервала «1:05:04» в HH: формат ММ Informix 11.50

Моя идея заключается в первую преобразовать секунды интервальных используя 3904 в качестве параметра:

ИНТЕРВАЛ (0: 0: 0) ЧАС ко второму + acdtime ЕДИНИЦЫ второй

и я получаю:

1:05:04

Тогда с преобразуйте этот результат в char и затем создайте подстроку.
Здесь я застрял.
Любая идея?

Большого спасибо

+0

что вы имеете в виду - «сделать это подстрокой»? – Hogan

+0

Я имею в виду, если бы я смог преобразовать полученный результат (1:05:04) в char (string), я мог бы конкатенировать ведущее 0, чтобы получить 01:05:04, а затем использовать функцию substring(), чтобы выбрать просто «01:05», который мне нужен (ЧЧ: ММ). С уважением! –

ответ

1

Поскольку вы хотите раз в формате ЧЧ: ММ, что о:

SELECT acdtime, 
     EXTEND(TODAY::DATETIME YEAR TO SECOND + acdtime UNITS SECOND, 
       HOUR TO MINUTE), 
     EXTEND(TODAY::DATETIME YEAR TO SECOND + 
       (TRUNC((acdtime + 59)/60)*60) UNITS SECOND, 
       HOUR TO MINUTE) 
    FROM TheAnonymousTable; 

Выход:

0 00:00 00:00 
    59 00:00 00:01 
    60 00:01 00:01 
3904 01:05 01:06 

Первое выражение обрезает доли минуту вниз, так что время от 0 до 59 секунды отображаются в нулевых минутах. Чаще всего «время по вызову» округляется до следующей большой минуты; это второе выражение. Обратите внимание, что это приводит к проблемам, если длительность вызова составляет 86400 секунд или более (1 день или более). Это можно устранить, но это не совсем тривиально (и определенно не кратким).

1

Если у вас есть очень архаичная версия Informix, что вы хотите, это функция TO_CHAR(), но вам необходимо значение DATETIME в качестве основы, а не интервал:

TO_CHAR(TODAY::DATETIME YEAR TO SECOND + 3904 UNITS SECOND, '%H:%M') 

... который будет производить:

(expression) 01:05 

Кастинг TODAY как DATETIME дает полночь, к которому вы можете добавить свои COUN т секунд. Конечно, этот метод предполагает, что звонок длится больше 23:59:59. Если эта возможность не может быть дисконтирована, вам может потребоваться обернуть выражение в оператор CASE, который проверяет acdtime < 86400.