DB2中如何改写SQL日期条件为MAX(CURRENT DATE,B.GGDTMSUG)的当月范围
DB2 SQL改写方案
要实现以CURRENT DATE和B.GGDTMSUG的最大值为基准计算当月范围,你可以按以下方式改写:
核心思路
- 使用
GREATEST(CURRENT DATE, B.GGDTMSUG)获取两个日期的较大值(需确保B.GGDTMSUG是DATE类型,若为字符型需先通过DATE(B.GGDTMSUG)转换) - 利用DB2内置函数
DATE_TRUNC('MONTH', ...)获取当月第一天,LAST_DAY(...)获取当月最后一天,再转换为yyyymmdd格式的数值用于筛选TXDTDBVL
改写后的完整SQL
SELECT '86', B.GGCDOGA, B.GGCDPAT1, CASE WHEN B.GGNOUGRAT <> ' ' THEN B.GGNOUGRAT ELSE B.GGNOUG END AS NOUG, 90, SUM(A.TXMTLOYANX) FROM IKOS_F.UGCSALP A, IKOS_F.UGP B WHERE -- 计算基准日期:CURRENT DATE与B.GGDTMSUG的最大值 TXDTDBVL >= YEAR(DATE_TRUNC('MONTH', GREATEST(CURRENT DATE, B.GGDTMSUG))) * 10000 + MONTH(DATE_TRUNC('MONTH', GREATEST(CURRENT DATE, B.GGDTMSUG))) * 100 + 1 AND TXDTDBVL <= YEAR(LAST_DAY(GREATEST(CURRENT DATE, B.GGDTMSUG))) * 10000 + MONTH(LAST_DAY(GREATEST(CURRENT DATE, B.GGDTMSUG))) * 100 + DAY(LAST_DAY(GREATEST(CURRENT DATE, B.GGDTMSUG))) AND ( (B.GGCDOGA, B.GGNOUG) IN ( SELECT DISTINCT IWCDORG, IWCDLOGT FROM IKOS_F.IMWXRUP ) OR (B.GGCDOGA, B.GGNOUGRAT) IN ( SELECT DISTINCT IWCDORG, IWCDLOGT FROM IKOS_F.IMWXRUP ) ) AND A.TXCDOGA = B.GGCDOGA AND A.TXNOUG = B.GGNOUG AND A.TXCDTTARIF = B.GGCDTTARIF GROUP BY B.GGCDOGA, B.GGCDPAT1, CASE WHEN B.GGNOUGRAT <> ' ' THEN B.GGNOUGRAT ELSE B.GGNOUG END;
补充说明
- 如果
B.GGDTMSUG是字符类型(比如CHAR(10)格式),需要先转换为DATE类型,将GREATEST(CURRENT DATE, B.GGDTMSUG)改为GREATEST(CURRENT DATE, DATE(B.GGDTMSUG)) - 若你的DB2版本不支持
DATE_TRUNC,可以用DATE(YEAR(target_date) || '-' || MONTH(target_date) || '-01')来构造当月第一天
内容的提问来源于stack exchange,提问作者yanomami
相关产品推荐
相关产品推荐

