如何计算数据为DECIMAL时的时间差?

How to calculate the diffrence between time when the data is DECIMAL?

我正在尝试计算两列之间的时间差,列中有数据:DECIMAL

我试过混合使用:

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

但是数据让它变得复杂,任何人都知道如何让它与 DECIMAL 一起工作?

我设法进行了 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

这背后有一个简单的数学计算。 如果将时间以 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