sql - 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;
解决方案
下面是一个非常基本的示例,说明如何将数字日期表示形式转换为日期以及如何对日期进行基本数学运算。将此处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 |
推荐阅读
- sed - grep 按字符串汇总行
- java - 我应该先转换字节流,缓冲区流还是字符流?
- python-3.x - Keras 顺序建模到功能 API
- javascript - 来自数据库的动态图表
- python - 如何从另一个类更新 tkinter 小部件图像?
- java - 有什么方法可以控制 java 部分中的“style.xml”元素?
- database - 如何用sqlite计算Jaccard相似系数
- android - 使用 CameraView 在 Android 上使用 ML Kit 检测人脸
- css - 如何使用一些引导程序的移动头等舱
- ios - Swift4:如何解决“致命错误:无法使用 upperBound < lowerBound 形成范围”?(UI中的持续时间延迟)