DB2 Crystal Reports声明/设置变量

时间:2019-01-30 18:18:33

标签: sql crystal-reports db2

我正在使用Crystal Reports从DB2 10.5中提取数据。我需要计算一个特定的日期,然后将这个计算出的日期用作过滤器。这是我目前如何实现此目标的示例。

WITH DATES AS (
    SELECT
        CASE 
        WHEN DAYOFWEEK(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS) = 2 
        THEN W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS 
        ELSE NEXT_DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS,'MON') 
    END AS FIRST_MONDAY_OF_CURRENT_MONTH
    FROM W100DP1.TWNSYSDATE
)

SELECT
    COUNT(*)
FROM 
    W100DP1.OASIS_PARTICIPANTS_HSTRY, DATES
WHERE 
    W100DP1.OASIS_PARTICIPANTS_HSTRY.ADDED_DT <= DATES.FIRST_MONDAY_OF_CURRENT_MONTH

这种方法有效,但是速度却很慢(我假设正在为我正在过滤的表中的每一行重新计算DATES.FIRST_MONDAY_OF_CURRENT_MONTH字段)。

当我简单地删除对DATES.FIRST_MONDAY_OF_CURRENT_MONTH的使用并指定一个特定的日期时,代码将非常快速地运行。

WITH DATES AS (
    SELECT
        CASE 
        WHEN DAYOFWEEK(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS) = 2 
        THEN W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS 
        ELSE NEXT_DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS,'MON') 
    END AS FIRST_MONDAY_OF_CURRENT_MONTH
    FROM W100DP1.TWNSYSDATE
)

SELECT
    COUNT(*)
FROM 
    W100DP1.OASIS_PARTICIPANTS_HSTRY, DATES
WHERE 
    W100DP1.OASIS_PARTICIPANTS_HSTRY.ADDED_DT <= DATE('12-01-2018)

有没有一种方法可以简单地声明一个不包含with语句的变量,该变量保存计算的日期的值?

2 个答案:

答案 0 :(得分:0)

  

有没有一种方法可以简单地声明一个不包含with语句的变量,该变量保存计算的日期的值?

CREATE VARIABLE FIRST_MONDAY_OF_CURRENT_MONTH DATE DEFAULT (
    (SELECT
        CASE 
        WHEN DAYOFWEEK(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS) = 2 
        THEN W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS 
        ELSE NEXT_DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS,'MON') 
    END AS FIRST_MONDAY_OF_CURRENT_MONTH
    FROM W100DP1.TWNSYSDATE) )

答案 1 :(得分:0)

您尝试过吗?

WITH DATES AS (
    SELECT
        CASE 
        WHEN DAYOFWEEK(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS) = 2 
        THEN W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS 
        ELSE NEXT_DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE - (DAY(W100DP1.TWNSYSDATE.SYSTEM_DATE) - 1) DAYS,'MON') 
    END AS FIRST_MONDAY_OF_CURRENT_MONTH
    FROM W100DP1.TWNSYSDATE
)

SELECT
    COUNT(*)
FROM 
    W100DP1.OASIS_PARTICIPANTS_HSTRY
WHERE 
    W100DP1.OASIS_PARTICIPANTS_HSTRY.ADDED_DT <= (SELECT FIRST_MONDAY_OF_CURRENT_MONTH FROM DATES);