首页 > 解决方案 > SQL比较2个日期并在> 3天时显示在表中

问题描述

在我的表中,我有几个日期字段,当我运行查询时,我想将重新安排日期(frsdt)与截止日期(frdte)进行比较,并且只显示 > 3 天的记录。我拉了几天头发,以为我会寻求帮助。任何帮助,将不胜感激。

SELECT fprod
    ,pord
    ,desc
    ,CASE 
    WHEN ftype = 'P' 
      THEN 'Planned' 
    ELSE 'Firm' 
    END
    ,vndnam
    ,fppvnd
    ,fqty
    ,DATE(TO_DATE(RTRIM(CHAR(fdate))
    ,DATE(TO_DATE(RTRIM(CHAR(frdte))
    ,DATE(TO_DATE(RTRIM(CHAR(frsdt))
    ,pecst * pqord
FROM avm
    ,kfp
    ,iiml01
    ,hpo 
INTO 
    :tblPAM.colItmNbr
    ,:tblPAM.colPONbr
    ,:tblPAM.colDesc
    ,:tblPAM.colType
    ,:tblPAM.colVendor
    ,:tblPAM.colVendorId
    ,:tblPAM.colQty
    ,:tblPAM.colRelDate
    ,:tblPAM.colDueDate
    ,:tblPAM.colRescDate
    ,:tblPAM.colPOAmount 
WHERE vendor = fppvnd 
    AND fprod = iprod 
    AND year(frsdt) < 9999 
    AND pldte > pddte + 3 days
    AND month(frsdt)|| '/' || day(frsdt) || '/' || year(frsdt) > month(frdte)|| '/' || day(frdte)  || '/' || year(frdte) 

在此处输入图像描述

建议从查询重写开始

SELECT T.*
FROM
(
SELECT fprod
    ,pord
    ,desc
    ,CASE 
    WHEN ftype = 'P' 
      THEN 'Planned' 
    ELSE 'Firm' 
    END some_alias1
    ,vndnam
    ,fppvnd
    ,fqty
    ,DATE(TO_DATE(RTRIM(CHAR(fdate)) fdate_alias
    ,DATE(TO_DATE(RTRIM(CHAR(frdte)) frdte_alias
    ,DATE(TO_DATE(RTRIM(CHAR(frsdt)) frsdt_alias
    ,pecst * pqord some_alias2
FROM avm
    ,kfp
    ,iiml01
    ,hpo 
WHERE vendor = fppvnd 
    AND fprod = iprod
) T 
WHERE year(frsdt_alias) < 9999 
  AND pldte_alias > pddte_alias + 3 days
  AND frsdt_alias > frdte_alias;

标签: sqldb2db2-400

解决方案


下面是一个非常基本的示例,说明如何将数字日期表示形式转换为日期以及如何对日期进行基本数学运算。将此处MYTAB的“虚拟”表视为包含 2 个数字列的表。
按原样运行。

SELECT *
FROM 
(
  SELECT
    DATE(TO_DATE(RTRIM(CHAR(D1)), 'YYYYMMDD')) DAT1
  , DATE(TO_DATE(RTRIM(CHAR(D2)), 'YYYYMMDD')) DAT2
  FROM
  (
  VALUES 
    (20181004, 20181007)
  , (20181004, 20181017)
  ) MYTAB (D1, D2)
) T
WHERE DAT2 > DAT1 + 3 DAY;

结果是:

|DAT1        |DAT2        |
|------------|------------|
|2018-10-04  |2018-10-17  |

推荐阅读