我的sql语句未在DB2中正确处理日期

时间:2019-03-12 18:14:39

标签: sql db2

我的查询返回了从日期(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; 

随后是示例输出。从2017年3月3日到2019年2月28日有30多年的时间,共有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

仍然有不好的结果

2 个答案:

答案 0 :(得分:1)

两个日期之间的天差(返回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')

答案 1 :(得分:0)

在LUW V11.1的Db2中,向武器库中添加了一些标量函数,包括DAYS_BETWEEN(first-datetime-expression,second-datetime-expression),MONTHS_BETWEEN,HOURS_BETWEEN以及其他类似类型的函数。