Как использовать SQL для обновления поля на следующий рабочий день с существующей таблицей выходных в DB2 - PullRequest
0 голосов
/ 30 апреля 2020

(DB2), например, сегодня (2020-04-30), 2020-05-01 - это национальный праздник в моей стране, а 2020-05-02, 2020-05-03 - выходные, поэтому следующий рабочий день на сегодняшний день это 2020-05-04.

Все эти три дня (2020-05-01, 2020-05-02, 2020-05-03) заносятся в таблицу «Выходные». Я просто хочу обновить значение другой таблицы на следующий рабочий день. Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

Вы можете сделать:

with 
d as (select h, h + 1 day as next_day from holiday where h >= '2020-04-30')
select min(next_day) from d where next_day not in (select h from d);

См. Пример выполнения на DB Fiddle .

РЕДАКТИРОВАТЬ для обновления

Чтобы выполнить UPDATE для другой таблицы, вы можете сделать:

update a
set d = (
  select min(next_day) from (
    select h, h + 1 day as next_day from holiday where h >= '2020-04-30'
  ) x where next_day not in (select h from holiday where h >= '2020-04-30')
)

См. Пример выполнения на DB Fiddle .

0 голосов
/ 30 апреля 2020

Лог c для любой данной даты должно быть следующим:

- следующий день, если это не выходной.
- первый «разрыв» в праздничные дни после данной дата в противном случае.

UPDATE TARGET
SET DT =
COALESCE
(
(SELECT V.DT FROM (VALUES DATE('2020-04-29') + 1) V(DT) WHERE NOT EXISTS (SELECT 1 FROM HOLIDAY A WHERE A.DT = V.DT))
,
(SELECT MIN(DT + 1) FROM HOLIDAY A WHERE A.DT > DATE('2020-04-29') AND NOT EXISTS (SELECT 1 FROM HOLIDAY B WHERE B.DT = A.DT + 1))
);
0 голосов
/ 30 апреля 2020

Идея состоит в том, чтобы определить начальную последовательность соседних праздников. Вы можете сделать это, перечислив праздники и сравнив перечисление с количеством дней в будущем. Если их нет, просто используйте hte на следующий день:

select coalesce(min(hdate), :date + 1 day
from (select h.*,
             row_number() over (order by hdate) as seqnum,
             days(hdate) - days(:date) as num_days
      from holidays h
      where hdate >= :date + 1 day
     ) h
where seqnum = num_days;

Это может быть включено в другой запрос, например, с помощью коррелированного подзапроса.

Вы столкнулись с проблемой создания holidays стол. Вы также можете go сделать следующий шаг и создать полную таблицу календаря с флагом «выходной». Тогда эта логика c будет проще и может быть прямо в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...