Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL如何减去浮点时间和字符串时间?_Sql_Db2 - Fatal编程技术网

SQL如何减去浮点时间和字符串时间?

SQL如何减去浮点时间和字符串时间?,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秒) 如何减法 这是我的完整表达式,因为我从两个表中获取值(我以这种格式获取它们,但不能进行减法)。我已

表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秒)

如何减法

这是我的完整表达式,因为我从两个表中获取值(我以这种格式获取它们,但不能进行减法)。我已经从两种时间戳格式中减去了小时数-结果是浮点。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;