DB2 Crystal 报告 Declare/Set 变量

DB2 Crystal Reports Declare/Set Variable

我正在使用 Crystal 报告从 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 字段正在为我过滤的 table 中的每一行重新计算)。

当我简单地删除 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 语句的情况下简单地声明一个保存计算日期值的变量?

Is there a way I can simply declare a variable that holds the value of the calculated date without using the with statement?

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) )

你试过吗?

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);