在 DB2 中添加迄今为止的天数
Posted
技术标签:
【中文标题】在 DB2 中添加迄今为止的天数【英文标题】:Adding number of days to date in DB2 【发布时间】:2014-03-03 10:16:16 【问题描述】:我有一个表,它查找 eff_dte = WK_BCC_DATES 的行。 WK_BCC_DATES 是在 PL1 程序中计算的变量,现在我需要在一个查询中完成此计算,以便 QMF 进行计算。计算为 WK_BCC_DATES = DTE1 + NO_DAYS。
SELECT SUBSTR(PARM_VALUE,1,10)
FROM BCD75DBA.BCCA6000 T60
WHERE T60.COUNTRY_CODE = '896'
AND T60.SUBSIDIARY_CODE = '01'
AND T60.PARM_NAME = 'BCC_DATES'
AND T60.EFF_DTE = (SELECT MAX(T60A.EFF_DTE)
FROM BCD75DBA.BCCA6000 T60A
WHERE T60A.COUNTRY_CODE = '896'
AND T60A.SUBSIDIARY_CODE = '01'
AND T60A.PARM_NAME = 'BCC_DATES')`
和
SELECT SUBSTR(PARM_VALUE,1,3)
FROM BCD75DBA.BCCA6000 T60
WHERE T60.COUNTRY_CODE = '896'
AND T60.SUBSIDIARY_CODE = '01'
AND T60.PARM_NAME = 'BCC_DAYS'
AND T60.EFF_DTE = (SELECT MAX(T60A.EFF_DTE)
FROM BCD75DBA.BCCA6000 T60A
WHERE T60A.COUNTRY_CODE = '896'
AND T60A.SUBSIDIARY_CODE = '01'
AND T60A.PARM_NAME = 'BCC_DAYS')`
我尝试将第一个查询分组为 DTE1,然后将第二个查询分组为 NO_DAYS,但出现错误“在使用的上下文中无效”。
请告知我还能做什么。我正在使用 DB2 v9。谢谢。
【问题讨论】:
WITH Most_Recent_Rows AS (SELECT parm_name, parm_value, ROW_NUMBER() OVER(PARTITION BY parm_name ORDER BY eff_dte DESC) AS rn FROM BCD75DBA.BCCA6000 WHERE country_code = '896' AND subsidiary_code = '01' AND parm_name IN ('BCC_DAYS', 'BCC_DATES')) SELECT CAST(SUBSTR(bcc_days.parm_value, 1, 3) AS DATE) + CAST(SUBSTR(bcc_dates.parm_value, 1, 10) AS INTEGER) DAYS as wk_bcc_dates FROM Most_Recent_Rows bcc_days JOIN Most_Recent_Rows bcc_dates ON bcc_dates.parm_name = 'BCC_DATES' AND bcc_dates.rn = 1 WHERE bcc_days.parm_name = 'BCC_DAYS' AND bcc_days.rn = 1
我做了这个查询,没有错误,我
这应该是对您的问题的编辑(或对我的回答的附加评论)。能否提供示例数据和建表脚本?
一个equivalent statement for SQL Server runs just fine,在修复了一个错误之后 - 你已经交换了CAST
数据类型(它可能甚至不应该成功)。
您应该选择右上角的帮助,然后进行快速浏览并使用帮助中心。答案是为了答案。 Questions 用于 Questions(每个问题一个问题,而不是滚动的“现在我遇到了这个问题”),Comments 用于 cmets、澄清和有关问题和特定答案的问题。
【参考方案1】:
那么,您想组合这些查询吗?这实际上很容易。如果没有您的组合查询,很难判断是什么导致了错误,但您可能已经把别名放在了不合适的位置。 (以供将来参考,您的表似乎是 EAV 的一些 - 实体属性值。将其用作未来查询的搜索词)
我认为稍微重写一下会帮助你:
WITH Most_Recent_Rows AS (SELECT parm_name, parm_value,
ROW_NUMBER() OVER(PARTITION BY parm_name
ORDER BY eff_dte DESC) AS rn
FROM BCD75DBA.BCCA6000
WHERE country_code = '896'
AND subsidiary_code = '01'
AND parm_name IN ('BCC_DAYS', 'BCC_DATES'))
SELECT CAST(SUBSTR(bcc_dates.parm_value, 1, 10) AS DATE) +
CAST(SUBSTR(bcc_days.parm_value, 1, 3) AS INTEGER) DAYS
FROM Most_Recent_Rows bcc_days
JOIN Most_Recent_Rows bcc_dates
ON bcc_dates.parm_name = 'BCC_DATES'
AND bcc_dates.rn = 1
WHERE bcc_days.parm_name = 'BCC_DAYS'
AND bcc_days.rn = 1
顺便说一句,我认为您正在尝试以下内容:
SELECT bcc_days, bcc_dates
FROM (SELECT SUBSTR(rw.parm_value, 1, 3) AS bcc_days
FROM BCD75DBA.BCCA6000 rw
JOIN (SELECT country_code, subsidiary_code, parm_name, MAX(eff_date) AS eff_date
FROM BCD75DBA.BCCA6000
WHERE parm_name = 'BCC_DAYS'
GROUP BY country_code, subsidiary_code, parm_name) ref
ON ref.country_code = rw.country_code
AND ref.subsidiary_code = rw.subsidiary_code
AND ref.parm_name = rw.parm_name
AND ref.eff_date = rw.eff_date) bcc_days
CROSS JOIN (SELECT SUBSTR(rw.parm_value, 1, 10) AS bcc_dates
FROM BCD75DBA.BCCA6000 rw
JOIN (SELECT country_code, subsidiary_code, parm_name, MAX(eff_date) AS eff_date
FROM BCD75DBA.BCCA6000
WHERE parm_name = 'BCC_DATES'
GROUP BY country_code, subsidiary_code, parm_name) ref
ON ref.country_code = rw.country_code
AND ref.subsidiary_code = rw.subsidiary_code
AND ref.parm_name = rw.parm_name
AND ref.eff_date = rw.eff_date) bcc_dates
由于子查询中的填充,这不太理想。这可以与答案的前一部分结合使用(对GROUP BY
使用 CTE,然后加入两次)。我不确定哪种方法实际上会产生更好的性能。
由于缺少样本数据和所需结果,以及我目前没有实例,这两个查询都没有经过测试。
【讨论】:
其实第一个查询:SELECT SUBSTR(PARM_VALUE,1,10) FROM BCD75DBA.BCCA6000 T60 WHERE T60.COUNTRY_CODE = '896' AND T60.SUBSIDIARY_CODE = '01' AND T60.PARM_NAME = 'BCC_DATES' AND T60.EFF_DTE = (SELECT MAX(T60A.EFF_DTE) FROM BCD75DBA.BCCA6000 T60A WHERE T60A.COUNTRY_CODE = '896' AND T60A.SUBSIDIARY_CODE = '01' AND T60A.PARM_NAME = 'BCC_DATES')
会给出一个类似'2014-01-01'的日期
第二个将给出代表天数的'300'。基本上我想要做的是在'2014-01-01'中添加'300'天
嗨,你给出的第一个查询工作。现在我需要添加这两个值。 BCC_DAYS BCC_DATES -------- ---------- 300 2013-02-10
CAST(bcc_dates as DATE) + CAST(bcc_days AS INTEGER)DAYS as wk_bcc_dates
我在SUBSTR(bcc_dates.parm_value, 1, 10) AS bcc_dates
之后添加了上面的代码,但出现-206 错误
@reignreign - 你不能在之后添加它 - 你必须包装它(DB2 似乎不支持在同一“级别”中使用声明 - 虽然我认为你可以在HAVING(...)
子句)。我已使用所需的语法更新了顶部查询。以上是关于在 DB2 中添加迄今为止的天数的主要内容,如果未能解决你的问题,请参考以下文章