C# 将包含三个或四个字符的DB2十进制转换为有效时间

C# 将包含三个或四个字符的DB2十进制转换为有效时间,c#,sql,time,db2,C#,Sql,Time,Db2,在数据库中,我们将时间存储为十进制。有些地方存储为三位数字,另一些地方存储为四位数字 e、 g 时间必须是04:15,我使用的是24小时时钟 我已经尝试使用了中的cast语句,当时间表示为4位小数时,该语句非常有效。但是,当时间表示为3位数字时,我得到一个空值 谁能建议一个同时使用三位数和四位数小数的语句,并将其转换为时间 多亏了GMB 下面的工作,但不是像400,500,600等值的一点进展,但我不会在这里没有GMB的帮助 这项工作: SELECT cast( cast(floor(0415/

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

e、 g

时间必须是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
注意,代码是针对DB2iSeries版本的,如果您运行的是LUWDB2,请使用GMB的答案


关于它为什么不适用于400、500等值的任何帮助信息?

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

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

如果愿意,您可以将其转换为时间。

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

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

然后,如果愿意,您可以将其转换为时间。

您可以使用数字算术获得小时和分钟部分,然后转换为字符串、串联和转换为时间:

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

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
12月|日 ------: | -------: 415.00 | 04:15:00 2359.00 | 23:59:00
您可以使用数字算术获得小时和分钟部分,然后转换为字符串、串联和转换为时间:

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

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
12月|日 ------: | -------: 415.00 | 04:15:00 2359.00 | 23:59:00 您可以使用to_timestamp()

输入为十进制(4,0)

还是作为瓦查尔

select
  time(to_timestamp(lpad(time_as_char, 4, '0'),'HH24MI')) time
from (values '0415', '415') data (time_as_char)
您可以使用to_timestamp()

输入为十进制(4,0)

还是作为瓦查尔

select
  time(to_timestamp(lpad(time_as_char, 4, '0'),'HH24MI')) time
from (values '0415', '415') data (time_as_char)

下面的语句愉快地将0415转换为04:15 select CAST(SUBSTR(右('00'| |'0415',6),3,2)| |':'| | SUBSTR(右('00'| |'0415',6),5,2)作为时间)从“SYSIBM”。SYSDUMMY1下面的语句愉快地将0415转换为04:15 select CAST(右('00'| |'0415',6),3,2)| |':'来自“SYSIBM.SYSDUMMY1I”,我对世卫组织的DB2语法非常陌生。我喜欢你的回答。如何将单个十进制值转换为时间。我试过了,但失败了。从“SYSIBM”中选择cast(将地板(0415/100)转换为varchar(2))| |':'| |转换(415%100转换为varchar(2))作为时间)。SYSDUMMY1@Abe:你为什么说它失败了?你有错误吗?错误的结果?我测试了你的代码,它似乎工作得很好。谢谢你的关注。我使用的是DBeaver,如果我运行上面修改过的语句,我会得到一个错误-关键字“as”notexpectedanythinks?我使用的是DB2,用于查询DB的IDE是DBEaver。任何问题都可以问。@Abe:我对DBeaver没有专门的知识,所以我真的不知道。。。如果您运行我在回答中提供的查询(以…开头),您会得到相同的错误吗?我对who DB2语法非常陌生。我喜欢你的回答。如何将单个十进制值转换为时间。我试过了,但失败了。从“SYSIBM”中选择cast(将地板(0415/100)转换为varchar(2))| |':'| |转换(415%100转换为varchar(2))作为时间)。SYSDUMMY1@Abe:你为什么说它失败了?你有错误吗?错误的结果?我测试了你的代码,它似乎工作得很好。谢谢你的关注。我使用的是DBeaver,如果我运行上面修改过的语句,我会得到一个错误-关键字“as”notexpectedanythinks?我使用的是DB2,用于查询DB的IDE是DBEaver。任何问题都可以问。@Abe:我对DBeaver没有专门的知识,所以我真的不知道。。。如果您运行我在回答中提供的查询(以“
开头,以…”
开头),是否会出现相同的错误?