【问题标题】:DB2 SQL Time Math decimal precision not visibleDB2 SQL 时间数学小数精度不可见
【发布时间】:2020-05-19 16:26:57
【问题描述】:

这个问题主要是出于对看似如此简单的事情感到沮丧,我无法开始工作......

我们的 ERP 系统 (Infor XA) 存储日期和时间,例如 1200203145125,即 CYYMMDDHHMMSS。世纪字节为 0 = 19 和 1 = 20。因此“120”(CYY) = 2020 年。该列是数字。对于刷卡工作的工人,我需要测量他们刷卡时间和现在时间之间的经过时间。因此,假设今天早上 5:31 有一个工人刷卡,时间戳可能如下所示:1200203053116(和 16 秒)。我正在使用 CURRENT_TIMESTAMP 作为“现在”时间。

到目前为止,为了得到差异,我在 VARCHAR_FORMAT()、CAST() 和数据类型不匹配错误的海洋中游泳了一天的大部分时间。到目前为止,我得到的最接近的是转换这两个时间 - 滑动时间和 CURRENT_TIMESTAMP 与午夜_秒() 将两个时间都减少到自午夜以来的数字秒数,然后减去两者。这有效,以秒为单位返回两次之间的差异。 (顺便说一句,我从滑动日期 TRNDT 中修剪了引入的世纪字节)

--difference in hours (now)
     (midnight_seconds(CURRENT_TIMESTAMP)) - (midnight_seconds('20' || SUBSTR(ALLMOTRAN.TRNDT,2,2) || '-' || 
     SUBSTR(ALLMOTRAN.TRNDT,4,2) || '-' || SUBSTR(ALLMOTRAN.TRNDT,6,2) || ' ' || SUBSTR(ALLMOTRAN.TTIME,1,2) || ':' || 
     SUBSTR(ALLMOTRAN.TTIME,3,2) || ':' || SUBSTR(ALLMOTRAN.TTIME,5,2))) AS UNPOSTHRS

所以...很棒似乎很容易。但我需要十进制小时的答案。当我尝试将上述内容除以 3600 时,我只能得到一个整数答案。

--difference in hours (now)
     (midnight_seconds(CURRENT_TIMESTAMP)) - (midnight_seconds('20' || SUBSTR(ALLMOTRAN.TRNDT,2,2) || '-' || 
     SUBSTR(ALLMOTRAN.TRNDT,4,2) || '-' || SUBSTR(ALLMOTRAN.TRNDT,6,2) || ' ' || SUBSTR(ALLMOTRAN.TTIME,1,2) || ':' || 
     SUBSTR(ALLMOTRAN.TTIME,3,2) || ':' || SUBSTR(ALLMOTRAN.TTIME,5,2)))/3600 AS UNPOSTHRS

我尝试了一些 CAST(xxxxx AS DECIMAL(4,2)) 类型的东西,但这也不起作用。任何建议都会很棒(即使这样做的方式与我一直在尝试的完全不同)。可悲的是,我希望这是我们的 SQL Server 机器上的任务,而不是我们的 ERP 系统。我本可以在 5 分钟内完成。

谢谢!

【问题讨论】:

    标签: sql date timestamp db2 mathematical-optimization


    【解决方案1】:

    您看到的问题称为整数除法。相当多的数据库,当给定两个整数相除时,返回一个整数,表示结果的整数部分。

    您可以通过使用另一个操作强制十进制上下文来解决此问题:

    1.0 * (your big expression) / 3600
    

    或者更好:

    (your big expression) / 3600.0
    

    【讨论】:

    • 大声笑哇.... 工作......(我的大表情)/ 3600.00 非常感谢!!
    • @JohnJoseph:是的,当然,这更简单。欢迎!
    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多