SQL如何减去浮点时间和字符串时间?
表DB2SQL如何减去浮点时间和字符串时间?,sql,db2,Sql,Db2,表DB2 ID HOURS HOURSMINUTES 1000 480.5 30:30:00 我想得到小时分钟 ID HOURS - HOURSMINUTES 1000 450.0 小时是以小时为单位的浮动值,因此为480.5小时。HOURSMINUTES是字符串值:30:30:00(30小时30分钟00秒) 如何减法 这是我的完整表达式,因为我从两个表中获取值(我以这种格式获取它们,但不能进行减法)。我已
ID HOURS HOURSMINUTES
1000 480.5 30:30:00
我想得到小时分钟
ID HOURS - HOURSMINUTES
1000 450.0
小时是以小时为单位的浮动值,因此为480.5小时。HOURSMINUTES是字符串值:30:30:00(30小时30分钟00秒)
如何减法
这是我的完整表达式,因为我从两个表中获取值(我以这种格式获取它们,但不能进行减法)。我已经从两种时间戳格式中减去了小时数-结果是浮点。cumulativetime是字符串值
select t1.id,
dec (( timestampdiff(
4,
char(t1.actualfinish - t1.reportdate))/60.00),10,2) as HOURS,t2.cumulativetime as HOURSMINUTES
from t1
join t2 on t2.id=t1.id
当我尝试在下面插入解决方案时,我得到了一个错误
select t1.id,
dec (( timestampdiff(
4,
char(t1.actualfinish - t1.reportdate))/60.00),10,2) as HOURS,t2.cumulativetime as HOURSMINUTES,
dec (( timestampdiff(
4,
char(t1.actualfinish - t1.reportdate))/60.00),10,2)- cast(substr(t2.cumulativetime, 1, 2) as int) -
(cast(substr(t2.cumulativetime, 4, 2) as int) / 60.0) as diff
from t1
join t2 on t2.id=t1.id
我也试过Kapil版本:
select t1.id,
dec (( timestampdiff(
4,
char(t1.actualfinish - t1.reportdate))/60.00),10,2) as HOURS,t2.cumulativetime as HOURSMINUTES,
(dec (( timestampdiff(
4,
char(t1.actualfinish - t1.reportdate))/60.00),10,2) - (CAST(substr(t2.cumulativetime , 1, 2) AS float) + CAST(substr(t2.cumulativetime , 4, 2) AS float)/60 + CAST(substr(t2.cumulativetime , 7, 2) AS float)/3600)) as diff
from t1
join t2 on t2.id=t1.id
试试这个:
Select (HOURS - (CAST(substr(HOURSMINUTES , 1, 2) AS float) + CAST(substr(HOURSMINUTES , 4, 2) AS float)/60 + CAST(substr(HOURSMINUTES , 7, 2) AS float)/3600)) as diff
From table
以下是在兼容模式下使用DB2 for z/OS 9.1版的解决方案:
select
t.HRS
- cast(substr(t.HMS, 1, locate(':', t.HMS) - 1) as FLOAT)
- (cast(substr(t.HMS, locate(':', t.HMS) + 1, locate(':', t.HMS, locate(':', t.HMS) + 1) - locate(':', t.HMS) - 1) as FLOAT) / 60.0)
- (cast(substr(t.HMS, locate(':', t.HMS, locate(':', t.HMS, locate(':', t.HMS) + 1)) + 1) as FLOAT) / 3600.0)
from
(
select
cast(480.5 as float) as HRS
, '333:44:55' as HMS
from
sysibm.SYSDUMMY1
) as t
with ur for read only;
这将产生146.7513888888887
的结果
如果可用,您可以使用它简化在
HMS
字符串中查找第n个:
。op标记了DB2,因此substr
而不是substring
谢谢。更正。在本例中,我的HOURSMINUTES列以30(小数点后两位)开头,但表中的值有1,2,3,4,5,6,7,8,9位小数,因此我无法使用此查询,因为“:”将作为无效的浮点值进行部分减法,然后如何解决此问题,使小时的所有值在小时分钟列中唯一?然后您可以使用查找时间字符串的正确部分。您可以尝试此方法吗?选择t1.id,dec((timestampdiff(4,char(t1.actualfinish-t1.reportdate))/60.00),10,2)作为小时,t2.cumulativetime作为小时分钟,cast(substr(t2.cumulativetime,1,2)作为int)作为hhdif,(cast(substr(t2.cumulativetime,4,2)作为int)/60.0)由于mmdiff来自t2.id=t1.id上的t1 join t2
请发布输出或错误消息Paul I Succeed问题是我的列中有一个值是512:30:30,因此substr(1,2)(4,2)采用了无效值(“:”包含在内)。那么如何解决这个问题呢?要始终适用无米,小数位在小时分钟列中需要多少小时?谢谢,在这种情况下,我的HOURSMINUTES列以30(两位小数)开头,但表中的值有1,2,3,4,5,6,7,8,9位小数,因此我不能使用此查询,因为“:”将部分作为浮点值进行减法,该值无效。如何解决此问题,使HOURSMINUTES列中的所有小时值都是唯一的?
select
t.HRS
- cast(substr(t.HMS, 1, locate(':', t.HMS) - 1) as FLOAT)
- (cast(substr(t.HMS, locate(':', t.HMS) + 1, locate(':', t.HMS, locate(':', t.HMS) + 1) - locate(':', t.HMS) - 1) as FLOAT) / 60.0)
- (cast(substr(t.HMS, locate(':', t.HMS, locate(':', t.HMS, locate(':', t.HMS) + 1)) + 1) as FLOAT) / 3600.0)
from
(
select
cast(480.5 as float) as HRS
, '333:44:55' as HMS
from
sysibm.SYSDUMMY1
) as t
with ur for read only;