我试图计算两列之间的时间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
答案 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