我正在使用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语句的变量,该变量保存计算的日期的值?
答案 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);