DB2 SQL 时间数学小数精度不可见
DB2 SQL Time Math decimal precision not visible
这个问题主要是出于对看似简单但我无法开始工作的事情的沮丧...
我们的 ERP 系统 (Infor XA) 存储日期和时间,如 1200203145125,即 CYYMMDDHHMMSS。世纪字节为 0 = 19 和 1 = 20。因此“120”(CYY) = 2020 年。该列是数字。对于刷卡进入工作的员工,我需要测量他们刷卡时间和现在时间之间经过的时间。因此,假设一名工作人员今天上午 5:31 刷卡,时间戳可能如下所示:1200203053116(16 秒)。我使用 CURRENT_TIMESTAMP "right now" 时间。
到目前为止,为了尝试减去差异,我一天的大部分时间都在 VARCHAR_FORMAT()、CAST() 和数据类型不匹配错误的海洋中游泳。到目前为止我得到的最接近的是转换两个时间 - 滑动时间,以及 CURRENT_TIMESTAMP 和 midnight_seconds() 将两个时间都减少到自午夜以来的数字秒数,然后减去两者。这行得通,以秒为单位返回两次之间的差异。 (顺便说一句,我从滑动日期 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 服务器机器而不是我们的 ERP 系统上的任务。我本可以在 5 分钟内完成。
谢谢!
您看到的问题叫做整数除法。相当数量的数据库,当给定两个整数进行除法时,return 一个表示结果整数部分的整数。
您可以通过使用其他操作强制十进制上下文来解决此问题:
1.0 * (your big expression) / 3600
或者更好:
(your big expression) / 3600.0
这个问题主要是出于对看似简单但我无法开始工作的事情的沮丧...
我们的 ERP 系统 (Infor XA) 存储日期和时间,如 1200203145125,即 CYYMMDDHHMMSS。世纪字节为 0 = 19 和 1 = 20。因此“120”(CYY) = 2020 年。该列是数字。对于刷卡进入工作的员工,我需要测量他们刷卡时间和现在时间之间经过的时间。因此,假设一名工作人员今天上午 5:31 刷卡,时间戳可能如下所示:1200203053116(16 秒)。我使用 CURRENT_TIMESTAMP "right now" 时间。
到目前为止,为了尝试减去差异,我一天的大部分时间都在 VARCHAR_FORMAT()、CAST() 和数据类型不匹配错误的海洋中游泳。到目前为止我得到的最接近的是转换两个时间 - 滑动时间,以及 CURRENT_TIMESTAMP 和 midnight_seconds() 将两个时间都减少到自午夜以来的数字秒数,然后减去两者。这行得通,以秒为单位返回两次之间的差异。 (顺便说一句,我从滑动日期 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 服务器机器而不是我们的 ERP 系统上的任务。我本可以在 5 分钟内完成。
谢谢!
您看到的问题叫做整数除法。相当数量的数据库,当给定两个整数进行除法时,return 一个表示结果整数部分的整数。
您可以通过使用其他操作强制十进制上下文来解决此问题:
1.0 * (your big expression) / 3600
或者更好:
(your big expression) / 3600.0