0

我有以下查询。我正在计算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 个月后返回下一行。

在此处输入图像描述

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);
4

2 回答 2

0

它怎么可能返回任何东西?

WHERE MYDATE = DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS

放弃转化,你在问WHERE MYDATE = MYDATE - 3 months

这永远不会是平等的......也许你忘了改变内在MYDATECURRENT_DATE东西?那也需要转换来改变..

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

WHERE MYDATE = ConvertToIDate(CCURRENT_DATE - 3 months, '*CCYMD');

于 2020-02-10T16:00:28.967 回答
0

试试这个:

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);
于 2020-02-10T05:41:24.773 回答