如何计算时间差异性之探源当数据为十进制?

时间:2019-02-02 19:42:12

标签: db2 timestampdiff

我试图计算两列之间的时间driffrence,该列具有数据:DECIMAL

我试图与以下人群混合:

TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1997-03-01-00.00.00') 
    - TIMESTAMP('1997-02-01-00.00.00')))

但数据使得复杂的,任何人有任何想法,如何使它与十进制工作?

我成功进行了som字符串转换,并使用此代码实际获得了正确的时间,但是现在我尝试计算它们之间的差异,但是我被卡住了。

cast( substr( right( '00' ||cTime, 4) ,1,2) || ':' ||substr( right( '00'  ||cTime, 4) ,3,2)  as time) as "changeTime", 
cast( substr( right( '00' ||iTime, 4) ,1,2) || ':' || substr( right( '00' ||iTime, 4) ,3,2)  as time) as "inTime"

这是我想区别的代码,

我希望输出:

| 10:27:00 | 10:30:00 | 3 |

如果有人需要更多的信息,让我知道这样我就可以有更多的信息编辑。任何帮助将不胜感激。

版本:AS400上的7.3 DB2

1 个答案:

答案 0 :(得分:2)

这背后有一个简单的数学计算。 如果将时间以HHMM形式存储在dec(4)列中,则这些时间之间的时差很简单:

首先,我们从这样的值计算HOURS和MINUTES:

  

HHx = int(Cx)/ 100

     

MMx = MOD(int(Cx),100)

第二,我们以分钟为单位计算差异:

  

DIFF =(HH2 * 60 + MM2)-(HH1 * 60 + MM1)

最后,我们计算HOURS和MINUTES之差:

  

HOURS = DIFF / 60

     

MINUTES = MOD(DIFF,60)

示例:

select 
  digits(dec(int(c)/100, 2))||':'||digits(dec(mod(int(c), 100), 2))||':00' as cTime
, digits(dec(int(i)/100, 2))||':'||digits(dec(mod(int(i), 100), 2))||':00' as iTime
,     ((int(i)/100*60 + mod(int(i), 100)) - (int(c)/100*60 + mod(int(c), 100)))/ 60  as hours
, mod(((int(i)/100*60 + mod(int(i), 100)) - (int(c)/100*60 + mod(int(c), 100))), 60) as minutes
from table(values 
  (dec(1027, 4), dec(1030, 4))
, (dec(1027, 4), dec(1126, 4))
, (dec(1027, 4), dec(1128, 4))
) t (c, i)

结果是:

CTIME       ITIME    HOURS MINUTES
--------    -------- ----- -------
10:27:00    10:30:00     0       3
10:27:00    11:26:00     0      59
10:27:00    11:28:00     1       1