在 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 中添加迄今为止的天数的主要内容,如果未能解决你的问题,请参考以下文章

如何在db2中查找从上个月28日到本月27日的天数

PostgreSQL:查找到现在为止的连续天数

查询当前为止的出生天数

C++ 计算两个日期之间的天数

java计算两个日期之间的天数

闰年的判断方法 和 当目前为止你生存的天数计算方法