简体   繁体   English

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

[英]Put date conversion in where clause db2 sql

I have the following query.我有以下查询。 And I am calculating on MYDATE column which is a DECIMAL(8, 0) data type which stores datea in numeric form in YYYYMMDD format like this 20191107.我正在计算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;

It works fine.它工作正常。 However, when I use the above conversion in a WHERE clause like below, query does not return anything.但是,当我在下面的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);

Example例子

在此处输入图片说明

Above is the data as is.以上是数据原样。 Now I pass the date 20200601 as parameter in the WHERE clause of the following query, it should return the following row after subtracting 3 months from 20200601.现在我在以下查询的WHERE子句中传递日期 20200601 作为参数,它应该在从 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);

Try this as is:试试这个:

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

How could it possibly return anything?它怎么可能返回任何东西?

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

Dropping the conversions, you're asking WHERE MYDATE = MYDATE - 3 months放弃转换,您会问WHERE MYDATE = MYDATE - 3 months

That's never going to be equal... Perhaps you forgot to change the inner MYDATE to CURRENT_DATE or something?这永远不会相等......也许你忘记将内部MYDATE更改为CURRENT_DATE或其他什么? That would also require the conversion to change..这也需要转换来改变..

Personally, I use a user defined function for this type of conversion;就个人而言,我使用用户定义的函数进行这种类型的转换; either write it yourself or download Alan Campin's free iDate source要么自己编写,要么下载 Alan Campin 的免费iDate

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM