DB2 Crystal Reports объявляет / устанавливает переменную - PullRequest
0 голосов
/ 30 января 2019

Я использую 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 голосов
/ 31 января 2019

Вы пробовали это?

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);
0 голосов
/ 31 января 2019

Есть ли способ, которым я могу просто объявить переменную, которая содержит значение вычисленной даты, без использования оператора 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) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...