在我的表中,我有一对夫妇的日期字段,当我运行我的查询,我想比较的重新安排日期(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;
下面是一个非常基本的例子,说明如何将数字日期表示法转换为日期,以及如何在日期上进行基本的数学运算。考虑 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 |
你可以用日期算术来解决这个问题。
例如,在SQL Server中,它看起来像这样。
WHERE dateadd(day,3, frsdt) >= frdte
在DB2中是这样的
WHERE frsdt + 3 DAYS >= frdte
在这里,我在第一个日期上加3天。 如果它大于目标日期,那么我就知道它们相隔不到3天。
如果我想知道日期是否相隔大于3天,我会用这个方法来代替
WHERE dateadd(day,3, frsdt) < frdte
添加日期的功能会根据你所使用的平台而改变--但基本的思路是按照我上面所展示的。 在日期上添加3天,然后在WHERE语句中进行比较。