Округление с полуночными секундами в DB2 - PullRequest
0 голосов
/ 08 октября 2019

Может быть, это проще, чем я понимаю, но я пытаюсь просто просмотреть записи, подобные приведенным ниже, и добавить временные метки, но для группировки, где разница составляет только секунды, мой набор результатов равен 0, но яЯ хотел бы получить это в десятичном виде для подсчета секунд.

Я использую DB2 на AS400 iSeries Версия 7

Образец данных

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), но у меня это не сработало, но все равно вернул ноль

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Если все столбцы и значения, используемые в операции деления, равны INGEGER (или BIGINT или SMALLINT), то деление будет целочисленным делением.

Вам необходимо привести что-либо к 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 голосов
/ 09 октября 2019

Это немного не по теме, но я думаю, что вы можете сделать с

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