Вычитание значений из двух падежных операторов друг от друга - PullRequest
0 голосов
/ 07 января 2020

У меня есть два оператора CASE, и я пытаюсь вычесть значение одного из другого, но я не могу заставить код работать. У кого-нибудь есть предложения, где я ошибаюсь?

2 утверждения CASE:

case
    when "D570M"."END_DATE" IS NULL then TO_CHAR(LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY')))
    when "D570M"."END_DATE" > (LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY'))) then TO_CHAR (LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY')))
    else TO_CHAR("D570M"."END_DATE", 'DD-MON-YYYY')
end as "END DATE",

и

case
    when "D570M"."START_DATE"> LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY')) then TO_CHAR((LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY'))), 'DD-MON-YYYY')
    else TO_CHAR("D570M"."START_DATE", 'DD-MON-YYYY')
end as "START DATE",

Когда я пытаюсь объединить эти получить ошибки (отсутствует правильная скобка). Объединенный код:

SUM(
    (
        case
            when "D570M"."END_DATE" IS NULL then TO_CHAR(LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY')))
            when "D570M"."END_DATE" > (LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY'))) then TO_CHAR (LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY')))
            else TO_CHAR("D570M"."END_DATE", 'DD-MON-YYYY')
        end as "END DATE"
    ) -
    (
        case
            when "D570M"."START_DATE"> LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY')) then TO_CHAR((LAST_DAY(TO_CHAR(ADD_MONTHS(sysdate, -1), 'DD-MON-YYYY'))), 'DD-MON-YYYY')
            else TO_CHAR("D570M"."START_DATE", 'DD-MON-YYYY')
        end as "START DATE")
    )

как «КАЛЕНДАРНЫЕ ДНИ»,

1 Ответ

1 голос
/ 07 января 2020

Форпас прав насчет псевдонимов; Вы также хотите удалить все эти вызовы TO_CHAR (). Вы хотите делать арифметику c с датами, а не со строками символов. Я думаю, что вы пытаетесь удалить временную часть даты, и функция, которую вы хотите для этого - TRUNC().

-- example data
with D570M as (select sysdate-60 as start_date, sysdate as end_date from dual)
-- query
select
        case
            when D570M.END_DATE IS NULL then TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1)))
            when D570M.END_DATE > TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1))) then TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1)))
            else TRUNC(D570M.END_DATE)
        end as "END DATE",
        case
            when D570M.START_DATE> TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1))) then TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1)))
            else TRUNC(D570M.START_DATE)
        end as "START DATE",
SUM(
    (
        case
            when D570M.END_DATE IS NULL then TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1)))
            when D570M.END_DATE > TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1))) then TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1)))
            else TRUNC(D570M.END_DATE)
        end
    ) -
    (
        case
            when D570M.START_DATE > TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1))) then TRUNC(LAST_DAY(ADD_MONTHS(sysdate, -1)))
            else TRUNC(D570M.START_DATE)
        end
    )) as "CALENDAR DAYS"
from d570m;

Вывод:

END DATE  START DATE CALENDAR DAYS
--------- ---------- -------------
31-DEC-19 08-NOV-19             53
1 row selected.
...