繁体   English   中英

将包含三个或四个字符的 DB2 Decimal 转换为有效时间

[英]Convert DB2 Decimal with three or four chars to a valid time

在数据库中,我们将时间存储为十进制。 有些地方它存储为三位数,而其他地方则存储为四位数。

例如

0415 
 415

时间必须是04:15 ,我使用的是 24 小时制。

我尝试使用以下链接中cast语句,它在时间表示为 4 位十进制数的情况下完美运行。 但是,当时间表示为 3 位数字时,我得到一个空值。

任何人都可以提出一个可以同时使用三位数和四位数十进制并将其转换为时间的语句。

感谢 GMB

以下工作但不适用于 400、500、600 等值。有点进步,但如果没有 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 等值的任何帮助?

您可以使用数字算术来获取小时和分钟部分,然后转换为字符串、连接并转换为时间:

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

您可以使用 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)

您需要将其构造为字符串:

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

如果您愿意,您可以将其转换为time

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM