DB2 SQL Time Math десятичная точность не видна - PullRequest
0 голосов
/ 04 февраля 2020

Этот вопрос в основном из-за разочарования по поводу чего-то, что кажется таким простым, и я не могу приступить к работе ...

Наша ERP-система (Infor XA) хранит дату и время, как это 1200203145125, что просто CYYMMDDHHMMSS. Байт века равен 0 = 19 и 1 = 20. Таким образом, «120» (CYY) = 2020 год. Столбец имеет номер c. Для работников, которые занимаются поиском работы, мне нужно измерить прошедшее время между их временем работы и временем прямо сейчас. Допустим, сегодня в 5:31 рабочего ударили, отметка времени может выглядеть следующим образом: 1200203053116 (и 16 секунд). И я использую CURRENT_TIMESTAMP для времени "прямо сейчас".

До сих пор, пытаясь вычесть разницу, я плавал в океане 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)), но это тоже не работает. Любые предложения были бы хорошими (даже делая это совершенно другим способом, чем я пытался). К сожалению, я sh это была задача на нашем SQL сервере вместо нашей системы ERP. Я мог бы сделать это за 5 минут.

Спасибо!

1 Ответ

2 голосов
/ 04 февраля 2020

Проблема, которую вы видите, называется целочисленное деление . Изрядное количество баз данных, если для разделения даны два целых числа, возвращает целое число, представляющее целую часть результата.

Вы можете обойти эту проблему, применяя десятичный контекст с помощью другой операции:

1.0 * (your big expression) / 3600

Или еще лучше:

(your big expression) / 3600.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...