Я использую 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?