我有一个包含两个WITH 子句的查询。第一个“feriados”返回名为“holidays”的表中的行的开始日期和结束日期之间的每一天。假期可能在同一天开始和结束,也可能有不同的开始和结束日期。第二个子句定义了一个名为“data_distinta”的函数,该函数确定一天是否是有效工作日。有效工作日定义为既不是周末也不是假日的一天(假日由“feriados”函数过滤)。当是有效工作日时,函数返回 1;当是有效工作日时,函数返回 1。否则,返回 0。
我遇到的问题是,最终结果显示两个相同的日子,“有效工作日”的值相反。
我无法创建新表来表示日历,并且现有日历表仅包含假期。
WITH RECURSIVE feriados AS
(
SELECT begin_date AS dateValue, entities_id AS id
FROM holidays
UNION ALL
SELECT DATE_ADD(dateValue, INTERVAL 1 DAY), id AS id
FROM feriados
WHERE DATE_ADD(dateValue, INTERVAL 1 DAY) <= (SELECT end_date FROM holidays WHERE DATE_ADD(dateValue, INTERVAL 1 DAY) BETWEEN begin_date AND end_date)
),
data_distinta AS
(
SELECT DISTINCT DATE( tickets.date) AS data,
(CASE
WHEN WEEKDAY( tickets.date)>=5 THEN 0
WHEN WEEKDAY( tickets.date)<5 AND DATE( tickets.date) NOT LIKE feriados.dateValue THEN 1
WHEN DATE( tickets.date) LIKE feriados.dateValue THEN 0
END
) AS validWorkDay
FROM tickets
LEFT JOIN entities
ON ( tickets.entities_id = entities.id)
LEFT JOIN calendars
ON ( calendars.entities_id = entities.id)
LEFT JOIN calendars_holidays
ON ( calendars.id = calendars_holidays.calendars_id)
LEFT JOIN holidays
ON ( holidays.id = calendars_holidays.holidays_id)
JOIN feriados)
SELECT data_distinta.data, data_distinta.validWorkDay
FROM data_distinta
WHERE data_distinta.data >= '05/01/2024'
这是我的代码
我期待着
但我越来越
不需要递归 CTE。只需将
LEFT JOIN
与 holidays
表结合使用,即可测试门票日期是否在假期的日期范围内。如果有比赛,那么购票日期就是假期期间。
SELECT DISTINCT DATE(t.date) AS data,
CASE WHEN WEEKDAY(t.date) >= 5 THEN 0
WHEN h.id IS NULL THEN 1
ELSE 0
END AS validWorkDay
FROM tickets AS t
LEFT JOIN holidays AS h ON t.date BETWEEN h.begin_date AND h.end_date
WHERE t.date >= '2024-05-01'
我不确定你为什么要加入所有其他表,你从不使用它们中的任何东西。