【问题标题】:Rounding with midnight seconds in DB2在 DB2 中用午夜秒四舍五入
【发布时间】:2019-10-08 16:04:54
【问题描述】:

也许这比我意识到的要简单,但我试图简单地查看下面的记录并将时间戳相加,但是对于差异仅以秒为单位的分组,我的结果集是 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) 但这对我不起作用,仍然返回零

【问题讨论】:

    标签: sql db2 db2-400


    【解决方案1】:

    如果除法运算中使用的所有列和值都是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

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

    【讨论】:

    • 好的,所以确实返回了一个小数,但它是 0.000000000,这看起来仍然很奇怪,因为秒数肯定存在差异。是不是午夜秒的使用可能会被抛弃?
    • A2.JOB_STATUS_TIME+- 子句中都有。一次需要A1
    • 当然!不知道这是怎么回事,但谢谢!
    【解决方案2】:

    这有点跑题了,但我认为你可以用

    TIMESTAMPDIFF(2, MAX(JOB_STATUS_TIME) - MIN(JOB_STATUS_TIME) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多