AS400 SQL Database Query - PullRequest
       25

AS400 SQL Database Query

1 голос
/ 19 марта 2019

Столбец времени имеет строковый тип, содержащий время в формате ЧЧММСС. Пример данных:

95030    
122030
132030 

Как видите, ведущих нулей нет.

Я пытаюсь извлечь вышеуказанные значения и преобразовать их во что-то вроде ниже

95030 -> 9:50:30
122030 -> 12:20:30

Запрос Sql:

select cast(Left(TIMECOLUMN, 1,1)||':'||substring(TIMECOLUMN,2,2)||':'||substring(TIMECOLUMN, 4,2) as string) 
from DBNAME.TABLENAME LIMIT 5;

Вышеприведенный запрос может выполняться только ниже,

95030 -> 9:50:30

Как бы я выполнил:

122030 -> 12:20:30

В том же запросе без необходимости запуска другого запроса?

Спасибо всем заранее!

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

В DB2 вы можете использовать TO_DATE() (это удобный псевдоним TIMESTAMP_FORMAT()) для преобразования строки в дату и TO_CHAR() (иначе VARCHAR_FORMAT()) чтобы отформатировать его:

SELECT TO_CHAR(TO_DATE(timecolumn, 'HH24MISS'), 'HH24:MI:SS') FROM DBNAME.TABLENAME LIMIT 5

В документации указано, что поддерживаются отсутствующие начальные нули:

Подстрока строкового выражения, представляющая компонент метки времени (например, год, месяц, день, час, минуты, секунды), может содержать меньше максимального количества цифр для этого компонента метки времени, указанного соответствующей элемент формата. Любые пропущенные цифры по умолчанию равны нулю. Например, если строка формата 'YYYY-MM-DD HH24:MI:SS', входное значение '999-3-9 5:7:2' даст тот же результат, что и '0999-03-09 05:07:02'.


Как прокомментировали @Dinu и @jmarkmurphy, это может не сработать из-за того, что части времени не разделены. В этом случае альтернативный подход заключается в ручном добавлении отсутствующего трейлинга 0 (s) перед конвертацией.

SELECT TO_CHAR(
    TO_DATE(
        RIGHT('000000' || timecolumn, 6),
        'HH24MISS'
    ),
    'HH24:MI:SS') 
FROM DBNAME.TABLENAME LIMIT 5
1 голос
/ 19 марта 2019

TO_DATE() недоступно на Db2 для IBM i ... Очевидно, что оно доступно, но документировано только в справочнике SQL как синтаксическая альтернатива функции TIMESTAMP_FORMAT ()

TIMESTAMP_FORMAT() (если предполагается, что вы используете поддерживаемый в настоящее время выпуск)

Однако для 95030 требуется * ведущий ноль ...

Следующее будет работать

select char(time(timestamp_format(right('0' concat timecolumn ,6),'HH24MISS')))
from DBNAME.TABLENAME
0 голосов
/ 19 марта 2019
  • Используйте Right вместо Left. Правая позиция зафиксирована.

или

  • Использовать SUBSTR с отрицательным индексом. Отрицательный индекс означает справа. То есть SUBSTR(X,-2,2) - секунды, SUBSTR(X,-4) - часы.

или

  • Считайте его целым числом и используйте, например, MOD (X, 100) для секунд, MOD (FLOOR (X / 100), 100) для минут и т. Д.

или

  • , если @Strom верно и SUBSTR не разрешает отрицательный индекс - просто добавьте LEN(): SUBSTR(X,LENGTH(X)-2,2) => секунд
...