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);
我正在使用 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);