DB2 使用标记的持续时间对多个日期间隔无效
DB2 use of labeled duration not valid with multiple date intervals
我正在尝试在 DB2/iSeries 上将 MySQL 查询重构为 运行,但出现错误使用标记持续时间无效。
查看文档,我觉得下面的用法应该有效。
我是不是漏掉了什么?
SELECT
IFNULL(SUM(CASE WHEN CURDATE() BETWEEN n.start_date AND n.expire_date
THEN 1 ELSE 0 END), 0) AS current,
IFNULL(SUM(CASE WHEN CURDATE() - 365 DAY BETWEEN n.start_date AND n.expire_date
THEN 1 ELSE 0 END), 0) AS prior,
IFNULL(SUM(CASE WHEN '2018-12-31' - 7 DAY BETWEEN n.start_date AND n.expire_date
THEN 1 ELSE 0 END), 0) AS full
FROM salesnumbers;
问题可能出在您的日期间隔上。尝试使用 CURRENT DATE
而不是 CURDATE()
。此外,您可以直接在 DB2 中列出日期间隔 +/- 一些数量。
SELECT
COUNT(CASE WHEN CURRENT DATE BETWEEN n.start_date AND n.expire_date
THEN 1 END) AS current,
COUNT(CASE WHEN CURRENT DATE - 1 YEAR BETWEEN n.start_date AND n.expire_date
THEN 1 END) AS prior,
COUNT(CASE WHEN DATE('2018-12-31') - 7 DAY BETWEEN n.start_date AND n.expire_date
THEN 1 END) AS full
FROM salesnumbers;
请注意,我用条件计数替换了您的条件总和。这使代码稍微更简洁,因为我们不必拼出明确的 ELSE
条件(默认为 NULL
)。
我正在尝试在 DB2/iSeries 上将 MySQL 查询重构为 运行,但出现错误使用标记持续时间无效。
查看文档,我觉得下面的用法应该有效。
我是不是漏掉了什么?
SELECT
IFNULL(SUM(CASE WHEN CURDATE() BETWEEN n.start_date AND n.expire_date
THEN 1 ELSE 0 END), 0) AS current,
IFNULL(SUM(CASE WHEN CURDATE() - 365 DAY BETWEEN n.start_date AND n.expire_date
THEN 1 ELSE 0 END), 0) AS prior,
IFNULL(SUM(CASE WHEN '2018-12-31' - 7 DAY BETWEEN n.start_date AND n.expire_date
THEN 1 ELSE 0 END), 0) AS full
FROM salesnumbers;
问题可能出在您的日期间隔上。尝试使用 CURRENT DATE
而不是 CURDATE()
。此外,您可以直接在 DB2 中列出日期间隔 +/- 一些数量。
SELECT
COUNT(CASE WHEN CURRENT DATE BETWEEN n.start_date AND n.expire_date
THEN 1 END) AS current,
COUNT(CASE WHEN CURRENT DATE - 1 YEAR BETWEEN n.start_date AND n.expire_date
THEN 1 END) AS prior,
COUNT(CASE WHEN DATE('2018-12-31') - 7 DAY BETWEEN n.start_date AND n.expire_date
THEN 1 END) AS full
FROM salesnumbers;
请注意,我用条件计数替换了您的条件总和。这使代码稍微更简洁,因为我们不必拼出明确的 ELSE
条件(默认为 NULL
)。