Конвертировать десятичное число DB2 с тремя или четырьмя символами в правильное время - PullRequest
1 голос
/ 22 января 2020

В базе данных мы храним время в десятичном виде. В некоторых местах он хранится как три цифры, а в других - как четыре цифры.

например

0415 
 415

Время должно быть 04:15, и я использую 24-часовые часы.

Я пытался использовать оператор cast из следующая ссылка , и она отлично работает, когда время представлено в виде десятичной дроби git. Однако я получаю нулевое значение, когда время представляется в виде 3 цифр.

Может кто-нибудь предложить утверждение, которое будет работать как с тремя цифрами, так и с четырьмя десятичными числами git и преобразовать его во время.

Благодаря GMB

Следующее работает, но не для таких значений, как 400, 500, 600 и т. Д. c. Небольшой прогресс, но я бы не попал сюда без помощи GMB

Это работает:

SELECT cast( cast(floor(0415/100) as varchar(2)) || ':' || cast(MOD(415,100) as varchar(2)) as time ) FROM "SYSIBM".SYSDUMMY1

Это не работает:

 SELECT cast( cast(floor(0400/100) as varchar(2)) || ':' || cast(MOD(400,100) as varchar(2)) as time ) FROM "SYSIBM".SYSDUMMY1

Обратите внимание, код для Версия DB2 iSeries, если вы используете LUW DB2, используйте ответ от GMB.

Любая помощь о том, почему он не работает для значений, таких как 400, 500 и т. Д. c?

Ответы [ 3 ]

1 голос
/ 22 января 2020

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

cast(
    cast(floor(dec/100) as varchar(2)) || ':' || cast(dec%100 as varchar(2))
    as time
)

Демонстрация на DB Fiddle :

create table t (dec decimal(10, 2));
insert into t values (415), (2359)

select dec, cast(
    cast(floor(dec/100) as varchar(2))
    || ':' 
    || cast(dec%100 as varchar(2))
as time) res 
from t
    DEC |      RES
------: | -------:
 415.00 | 04:15:00
2359.00 | 23:59:00
0 голосов
/ 22 января 2020

Вы можете использовать to_timestamp ()

с вводом в виде десятичного числа (4, 0)

select
  time(to_timestamp(digits(time_as_dec_4),'HH24MI')) time
from (values dec(0415,4),dec(415,4)) data (time_as_dec_4)

или как varchar

select
  time(to_timestamp(lpad(time_as_char, 4, '0'),'HH24MI')) time
from (values '0415', '415') data (time_as_char)
0 голосов
/ 22 января 2020

Вам нужно построить это как строку:

select lpad(floor(time / 100), 2, '0') concat ':' concat lpad(time % 60, 2, '0')

Затем вы можете преобразовать это в time, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...