Как получить список дат в распространяющемся SQL

#recursive-query #pervasive #actian

#рекурсивный запрос #распространенный #actian

Вопрос:

Наша база данных по времени и посещаемости-это всепроникающая/активная база данных Дзен. Что я пытаюсь сделать, так это создать запрос, в котором просто перечислены следующие 14 дней с сегодняшнего дня. Затем я сопоставлю этот список дат с записями сотрудников, чтобы фактически у меня был список людей/дат на следующие 14 дней.

Я довольно легко сделал это с помощью рекурсивного CTE на SQL server. Я также мог бы сделать это с помощью цикла в SQL Server, но я не могу понять это с помощью всепроникающего SQL. Циклы могут существовать только внутри хранимых процедур и триггеров.

Оглядевшись, я подумал, что этот код, который я нашел и адаптировал, может сработать, но это не так (и дальнейшие исследования показывают, что в Pervasive вообще нет рекурсивного варианта.

 WITH RECURSIVE cte_numbers(n, xDate)  AS (  SELECT   0, CURDATE()   1  UNION ALL  SELECT   n 1,   dateAdd(day,n,xDate)   FROM   cte_numbers   WHERE n lt; 14 ) SELECT   xDate  FROM  cte_numbers;  

Я просто подумал, может ли кто-нибудь помочь мне написать SQL-запрос, который дает мне этот список дат, вне хранимой процедуры.

Комментарии:

1. Вы хотели создать (временную) таблицу на следующие 14 дней, но однократное создание таблицы большего размера (и фильтрация) выполняет ту же работу.

Ответ №1:

Когда вы создаете таблицу, подобную этой:

 CREATE TABLE dates(d DATE PRIMARY KEY, x INTEGER);  

И создайте первую запись, подобную этой:

 INSERT INTO dates VALUES ('2021-01-01',0);  

Затем вы можете использовать эту инструкцию , которая удваивает количество записей в таблице dates при каждом ее выполнении. (поэтому вам нужно запустить его пару раз

Когда вы запустите его 10 раз, в таблице dates будет указана последняя дата 21 октября 2023 года. Когда вы запустите его 12 раз, последняя дата будет 19 марта 2032 года.

 INSERT INTO dates   SELECT   DATEADD(DAY,m.m 1,d),  x m.m 1   from dates  cross join (select max(x) m from dates) m  order by d;  

Конечно, столбец x можно удалить (необязательно) с помощью следующей инструкции, но вы не можете добавить больше записей, используя предыдущую инструкцию:

 ALTER TABLE dates DROP COLUMN x;  

Наконец, вернуться на следующий 14-й день с сегодняшнего дня:

 SELECT d  FROM DATES  WHERE d BETWEEN CURDATE( ) AND DATEADD(DAY,13,CURDATE());