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

Posted

技术标签:

【中文标题】将日期转换放在where子句db2 sql中【英文标题】:Put date conversion in where clause db2 sql 【发布时间】:2020-02-10 02:37:54 【问题描述】:

我有以下问题。我正在计算 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);

示例

以上是原样的数据。现在我在以下查询的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);

【问题讨论】:

示例数据在这里会有所帮助。 它只是一个十进制数据类型,以 YYYYMMDD 格式返回数字形式的日期,如 20191107。 【参考方案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);

【讨论】:

不清楚你想从你的问题中得到什么。提供一些表格数据的人工示例以及您想要获得的结果。例如,考虑一个有 3 行的表,其中包含以下日期:20200101、20200301、20200601。您想得到什么? 使用与您的编程环境相对应的更新示例中的参数标记。 不,它必须遍历表并且每个日期都为-3。 提供的解决方案对应于所陈述的问题。您根据提供的参数获得 1 行。您已经多次更改问题描述。请更正您的样本数据和所需的结果,或者使用此类信息提出另一个问题。【参考方案2】:

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

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

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

这永远不会相等...也许您忘记将内部 MYDATE 更改为 CURRENT_DATE 或其他什么?这也需要转换改变..

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

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

【讨论】:

以上是关于将日期转换放在where子句db2 sql中的主要内容,如果未能解决你的问题,请参考以下文章

SQL在where子句中转换日期格式

从 DB2 查询中 where 子句中输入的日期获取上个月

SAS:在where子句中将日期时间转换为日期

带有两个日期列的 sql 查询“where 子句”

SQL - 在 WHERE 子句中使用日期范围的结果集中未显示正确日期

如何将 varchar(2020 年 1 月 1 日)中的日期转换为 DB2 sql 中的日期类型?