0

我们的考勤数据库是 Pervasive/Actian Zen 数据库。我正在尝试做的是创建一个仅列出从今天起接下来的 14 天的查询。然后,我会将这个日期列表与员工记录交叉应用,这样实际上我就有了接下来 14 天的人员/日期列表。

我已经很容易地在 SQL 服务器上使用递归 CTE 完成了它。我也可以使用 SQL Server 中的循环来实现,但我无法使用 Pervasive 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 < 14
)
SELECT 
     xDate 
FROM 
cte_numbers;

我只是想知道是否有人可以帮助我编写一个 SQL 查询,在存储过程之外给我这个日期列表。

4

1 回答 1

0

当您创建这样的表时:

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

并创建这样的第一条记录:

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

然后你可以使用这个语句,它每次执行时都会使表中的记录数加倍。dates(所以你需要运行它几次

当您运行 10 次时,该表dates的最后日期为 2023 年 10 月 21 日。当您运行 12 次时,最后日期将是 2032 年 3 月 19 日。

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());
于 2021-12-11T16:18:42.330 回答