将日期转换放在db2 sql的where子句中

将日期转换放在db2 sql的where子句中,sql,db2,db2-400,Sql,Db2,Db2 400,我有以下疑问。我在计算MYDATE列,这是一种DECIMAL(8,0)数据类型,它以YYYYMMDD格式以数字形式存储datea,如图20191107所示 SELECT DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS, 'yyyymmdd')), 8, 0) FROM PDF_TABLE; 它很好用。但是,当我在下面这样的WHERE子句中使用上述转换时,查询不会返回

我有以下疑问。我在计算
MYDATE
列,这是一种
DECIMAL(8,0)
数据类型,它以YYYYMMDD格式以数字形式存储datea,如图20191107所示

SELECT DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS, 'yyyymmdd')), 8, 0) FROM PDF_TABLE;
它很好用。但是,当我在下面这样的
WHERE
子句中使用上述转换时,查询不会返回任何内容

SELECT * FROM PDF_TABLE WHERE MYDATE = DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS, 'yyyymmdd')), 8, 0);
示例

以上是数据。现在,我将日期20200601作为参数传递给下面查询的
WHERE
子句,它应该在20200601减去3个月后返回下一行

按原样试一试:

WITH MYTAB (PDF_VOLUME, MYDATE) AS
(
VALUES
  ('110 GB', DEC(20200101, 8))
, ('120 GB', DEC(20200301, 8))
, ('390 GB', DEC(20200601, 8))
)
SELECT * 
FROM MYTAB
WHERE MYDATE = DEC(TO_CHAR(TO_DATE(CHAR(CAST(? AS DEC(8))), 'YYYYMMDD') - 3 MONTH, 'YYYYMMDD'), 8);

它怎么可能返回任何东西

其中MYDATE=DECIMAL((TO_CHAR(TO_DATE)(CAST(CAST(MYDATE为INT)为VARCHAR(8)),'yyyyymmdd')-3个月

放弃转换后,您会问
其中MYDATE=MYDATE-3个月

这永远不会是相等的…也许您忘记将内部的
MYDATE
更改为
CURRENT\u DATE
或其他什么?这也需要转换来更改

就我个人而言,我使用一个用户定义的函数进行这种类型的转换;要么自己编写,要么下载Alan Campin的免费源代码


其中MYDATE=ConvertToDate(当前日期-3个月,*CCYMD')示例数据将有助于此。它只是一个十进制数据类型返回的数字形式的YyYYMMD格式,如20191107。您还不清楚从您的问题中得到什么。提供一些表格数据和您想要得到的结果的人工示例。例如,考虑一个具有3行的表和以下的表。在那里输入日期:20200101、20200301、20200601。您想得到什么?使用更新示例中的参数标记,对应于您的编程环境。不,它必须在表中迭代,并且每个日期-3。提供的解决方案对应于所述的问题。根据提供的参数,您可以得到1行。您已经得到了问题描述已重复多次。请更正您的示例数据和所需结果,或者使用此类信息询问另一个问题。
WITH MYTAB (PDF_VOLUME, MYDATE) AS
(
VALUES
  ('110 GB', DEC(20200101, 8))
, ('120 GB', DEC(20200301, 8))
, ('390 GB', DEC(20200601, 8))
)
SELECT * 
FROM MYTAB
WHERE MYDATE = DEC(TO_CHAR(TO_DATE(CHAR(CAST(? AS DEC(8))), 'YYYYMMDD') - 3 MONTH, 'YYYYMMDD'), 8);