首页 > 解决方案 > 在 DB2 中用午夜秒四舍五入

问题描述

也许这比我意识到的更简单,但我试图简单地查看下面的记录并将时间戳相加,但对于差异仅以秒为单位的分组,我的结果集是 0 但我想以小数形式计算秒数。

我在 AS400 iSeries 版本 7 上使用 DB2

样本数据

JOB_STATUS   |   JOB_STATUS_TIME
---------------------------------------------
 P                2019-10-02  08:47:12.362261
 P                2019-10-02  08:47:22.362261 
 P                2019-10-02  08:47:32.362261
 P                2019-10-02  08:47:42.362261
 P                2019-10-02  08:47:52.362261

询问:

SELECT
SUM
(
 CASE A1.JOB_STATUS WHEN 'P' THEN
(DAYS(A2.JOB_STATUS_TIME) - DAYS(A1.JOB_STATUS_TIME)) * 86400
 + MIDNIGHT_SECONDS(A2.JOB_STATUS_TIME) - 
 MIDNIGHT_SECONDS(A2.JOB_STATUS_TIME)
 END
 ) / 60 AS ACTIVE_MINUTES 
FROM SCHEMA.TABLE;

我尝试添加ROUND({sum query}, 2),但这对我不起作用,仍然返回零

标签: sqldb2db2-400

解决方案


如果除法运算中使用的所有列和值都是INGEGER(或BIGINTSMALLINT),则除法将是整数除法。

您需要将某些内容转换为 DECIMAL 或使用 DECFLOAT 值的十进制浮点数来获得十进制除法。例如尝试除以60.0

SELECT
   SUM(CASE A1.JOB_STATUS WHEN 'P' THEN
        (DAYS(A2.JOB_STATUS_TIME) - DAYS(A1.JOB_STATUS_TIME)) * 86400
       + MIDNIGHT_SECONDS(A2.JOB_STATUS_TIME)
       - MIDNIGHT_SECONDS(A1.JOB_STATUS_TIME)
 END
 ) / 60.0 AS ACTIVE_MINUTES 
FROM
   SCHEMA.TABLE

https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/db2/rbafz2intoper.htm

如果算术运算符的两个操作数都是小数位数为零的整数,则运算以二进制执行,结果是一个大整数,除非其中一个(或两个)操作数都是大整数,在这种情况下,结果是一个大整数。除法的任何余数都将丢失


推荐阅读