Мой SQL-оператор неправильно обрабатывает даты в DB2 - PullRequest
1 голос
/ 12 марта 2019

Мой запрос возвращает странные результаты для переменной, полученной из дат (lngth_srvc). Я думаю, что-то трактуется как символы, и вывод, который я получаю, - это разница между представлениями символов.

WITH core AS 
        (SELECT t.* 
         FROM   mhaods.stushh t 
         WHERE  stus_cd IN ( 'DWRT', 'FINL', 'DWFL', 'DWR', 
                             'DWSR', 'DWPC' ) 
                AND stdt BETWEEN '2017-02-28' AND '2019-02-28' 
         UNION 
         SELECT g.* 
         FROM   mhaods.stusha g 
         WHERE  stus_cd IN ( 'DWRT', 'FINL', 'DWFL', 'DWR', 
                             'DWSR', 'DWPC' ) 
                AND stdt BETWEEN '2017-02-28' AND '2019-02-28'), 
     core1a AS
        (SELECT p.*, 
                ROW_NUMBER() 
                  OVER( 
                    PARTITION BY asgnd_to_pin 
                    ORDER BY stdt asc) AS RANK 
         FROM   core p), 
     core1 AS
        (SELECT asgnd_to_pin, 
                stus_cd, 
                stdt, 
                RANK, 
                ( ( '2019-02-28' - stdt ) / 365 ) AS lngth_srvc_yrs, 
                (( '2019-02-28' - stdt ))         AS lngth_srvc_days 
         FROM   core1a 
         WHERE  RANK = 1 
                AND asgnd_to_pin IN ( '788387' ) 
         ORDER  BY stdt) 
SELECT asgnd_to_pin, 
       stdt, 
       lngth_srvc_yrs, 
       lngth_srvc_days 
FROM   core1 
ORDER  BY lngth_srvc_yrs 
FETCH first 20 ROWS only; 

Пример вывода следующий. Он имеет более 30 лет с 03.03.2017 по 28.02.2009 и 11125 дней.

ASGND_TO_PIN            STDT    LNGTH_SRVC_YRS  LNGTH_SRVC_DAYS
      788387    3/3/2017    30.4794520            11125
      259399    3/2/2017    30.4821917            11126
      155851    3/2/2017    30.4821917            11126
      304527    3/2/2017    30.4821917            11126
      881853    3/1/2017    30.4849315            11127
      144362    3/1/2017    30.4849315            11127
      271562    2/28/2017   54.7945205            20000
      618426    2/28/2017   54.7945205            20000

Я также попробовал код с

((DATE('2019-02-28')-DATE(stdt))) as lngth_srvc_days

и все еще получил плохие результаты

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Вычитание одной даты из другой в Db2 приводит к длительности , которая является десятичным числом, представляющим ГГГГММДД.

Итак, дата ('2017-02-28') - дата ('2019-02-28 ') = 2000, 2 года, 00 месяцев, 00 дней ...

Больше информации здесь Db2 Дата Арифметика

1 голос
/ 12 марта 2019

Разница в днях между 2 датами (возвращает 5):

values days(date('2019-03-10')) - days(date('2019-03-05'))

Не использовать STDT BETWEEN '2017-02-28' AND '2019-02-28'.
Использовать STDT BETWEEN date('2017-02-28') AND date('2019-02-28') вместо.

0 голосов
/ 13 марта 2019

В Db2 для LUW V11.1 в арсенал были добавлены некоторые скалярные функции, включая DAYS_BETWEEN (выражение-первое-время-время, выражение-второе-время-время), MONTHS_BETWEEN, HOURS_BETWEEN и другие аналогичные.

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