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

Posted

技术标签:

【中文标题】将具有三个或四个字符的 DB2 Decimal 转换为有效时间【英文标题】:Convert DB2 Decimal with three or four chars to a valid time 【发布时间】:2020-01-22 15:50:30 【问题描述】:

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

例如

0415 
 415

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

我已尝试使用 following link 中的 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 等值的任何帮助?

【问题讨论】:

【参考方案1】:

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

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

Demo on 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
十二月 | RES ------: | --------: 415.00 | 04:15:00 2359.00 | 23:59:00

【讨论】:

我对 who DB2 语法真的很陌生。我喜欢你的回答。如何将单个十进制值转换为时间。我试过这个,但失败了。 SELECT cast( cast(floor(0415/100) as varchar(2)) || ':' || cas​​t(415%100 as varchar(2)) as time ) FROM "SYSIBM".SYSDUMMY1 @Abe:你为什么说失败了?你有错误吗?错误的结果?我测试了你的代码,它似乎工作正常in this DB Fiddlde。 感谢您对此进行调查。我正在使用 DBeaver,如果我要运行上述修改后的语句,我会收到错误消息 - 关键字 'as' not expected 有什么想法吗?我正在使用 DB2,我用来查询 DB 的 IDE 是 DBEaver。有任何问题欢迎随时提问。 @Abe:我对 DBeaver 没有专门的知识,所以我无法确定...如果您运行我在回答中提供的查询(以 with... 开头),您是否得到相同的结果错误?【参考方案2】:

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

【讨论】:

【参考方案3】:

你需要把它构造成一个字符串:

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

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

【讨论】:

下面的语句愉快地将 0415 转换为 04:15 select CAST( SUBSTR( RIGHT( '00' || '0415', 6) ,3,2) || ':' || SUBSTR( RIGHT('00' || '0415', 6) ,5,2) AS TIME) FROM "SYSIBM".SYSDUMMY1

以上是关于将具有三个或四个字符的 DB2 Decimal 转换为有效时间的主要内容,如果未能解决你的问题,请参考以下文章

Java 为啥不提供decimal

有没有办法将 24 小时时间格式转换为一天的四个类别或四个象限?

怎么让 db2 decimal 四舍五入

db2如何 varchar转int类型

c# decimal类型 有没有像string.Empty那样的值?

DB2中字符转数字的问题