20/06/2026 - pierpippo ha scritto:
per quanto riguarda la tabella che mi fornisce le date di scadenza del periodo invernale/estivo,
lo avevo gia previsto.
se vuoi puoi continuare così, io l'ho ricostruita tramite query usando la stessa struttura di aggiornamento annuale delle date.
ti mostro la gestione annuale che avevo previsto con le tabelle necessarie per lo sviluppo del calendarioo corse.
-- create
CREATE TABLE corse_config (
id INT AUTO_INCREMENT PRIMARY KEY,
tipo_giorno VARCHAR(20),
numero_corse INT
);
CREATE TABLE festivita (
id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(255),
data DATE,
tipo ENUM('FISSO', 'VARIABILE', 'inizio', 'fine')
);
CREATE TABLE calendario_corse (
id INT AUTO_INCREMENT PRIMARY KEY,
data_servizio DATE,
tipo_giorno VARCHAR(20),
numero_corse INT,
generato_il TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE corse (
id INT AUTO_INCREMENT PRIMARY KEY,
data_servizio DATE,
numero_corsa INT,
ora_partenza TIME
);
-- insert
INSERT INTO festivita VALUES (0001, 'CAPODANNO', '2025-01-01', 'FISSO');
INSERT INTO festivita VALUES (0002, 'EPIFANIA', '2025-01-06', 'FISSO');
INSERT INTO festivita VALUES (0003, 'LIBERAZIONE', '2025-04-25', 'FISSO');
INSERT INTO festivita VALUES (0004, 'FESTA DEL LAVORO', '2025-05-01', 'FISSO');
INSERT INTO festivita VALUES (0005, 'REPUBBLICA', '2025-06-02', 'FISSO');
INSERT INTO festivita VALUES (0006, 'FERRAGOSTO', '2025-08-15', 'FISSO');
INSERT INTO festivita VALUES (0007, 'TUTTI I SANTI', '2025-11-01', 'FISSO');
INSERT INTO festivita VALUES (0008, 'IMMACOLATA', '2025-12-08', 'FISSO');
INSERT INTO festivita VALUES (0009, 'NATALE', '2025-12-25', 'FISSO');
INSERT INTO festivita VALUES (0010, 'SANTO STEFANO', '2025-12-26', 'FISSO');
INSERT INTO festivita VALUES (0011, 'PASQUA', '2025-12-26', 'VARIABILE');
INSERT INTO festivita VALUES (0012, 'PASQUETTA', '2025-12-26', 'VARIABILE');
INSERT INTO festivita VALUES (0013, 'scolastico', '2025-01-01', 'inizio');
INSERT INTO festivita VALUES (0014, 'scolastico', '2025-07-15', 'fine');
INSERT INTO festivita VALUES (0015, 'scolastico', '2025-09-15', 'inizio');
INSERT INTO festivita VALUES (0016, 'scolastico', '2025-12-31', 'fine');
INSERT INTO festivita VALUES (0017, 'estivo', '2025-07-16', 'inizio');
INSERT INTO festivita VALUES (0018, 'estivo', '2025-09-14', 'fine');
INSERT INTO corse_config (tipo_giorno, numero_corse) VALUES
('SCOLASTICO', 5),
('ESTIVO', 3),
('FESTIVO', 2);
-- fetch
-------------------------------------------------------------------------
// questa sarebbe la tua tabella periodi, io l'ho generata da festività
SELECT
nome,
data AS data_inizio,
(
SELECT MIN(data)
FROM festivita f2
WHERE f2.nome = f1.nome
AND f2.tipo = 'fine'
AND f2.data > f1.data
) AS data_fine
FROM festivita f1
WHERE tipo='inizio';
----------------------------------------------------------------------
query che genera il calendario
WITH RECURSIVE calendario AS (
SELECT DATE('2025-01-01') AS giorno /// qui usi il parametro inizio periodo
UNION ALL
SELECT giorno + INTERVAL 1 DAY
FROM calendario
WHERE giorno < '2025-12-31' /// qui usi il parametro fine periodo
),
periodi AS (
SELECT
f1.nome,
f1.data AS data_inizio,
(
SELECT MIN(f2.data)
FROM festivita f2
WHERE f2.nome = f1.nome
AND f2.tipo = 'fine'
AND f2.data > f1.data
) AS data_fine
FROM festivita f1
WHERE f1.tipo = 'inizio'
)
SELECT
c.giorno,
CASE
WHEN DAYOFWEEK(c.giorno) = 1
OR EXISTS (
SELECT 1
FROM festivita f
WHERE f.data = c.giorno
AND f.tipo IN ('FISSO','VARIABILE')
)
THEN 'FESTIVO'
WHEN EXISTS (
SELECT 1
FROM periodi p
WHERE p.nome = 'estivo'
AND c.giorno BETWEEN p.data_inizio AND p.data_fine
)
THEN 'ESTIVO'
WHEN EXISTS (
SELECT 1
FROM periodi p
WHERE p.nome = 'scolastico'
AND c.giorno BETWEEN p.data_inizio AND p.data_fine
)
THEN 'SCOLASTICO'
ELSE 'NESSUNO'
END AS servizio,
CASE
WHEN DAYOFWEEK(c.giorno) = 1
OR EXISTS (
SELECT 1
FROM festivita f
WHERE f.data = c.giorno
AND f.tipo IN ('FISSO','VARIABILE')
)
THEN 2
WHEN EXISTS (
SELECT 1
FROM periodi p
WHERE p.nome = 'estivo'
AND c.giorno BETWEEN p.data_inizio AND p.data_fine
)
THEN 3
WHEN EXISTS (
SELECT 1
FROM periodi p
WHERE p.nome = 'scolastico'
AND c.giorno BETWEEN p.data_inizio AND p.data_fine
)
THEN 5
ELSE 0
END AS numero_corse
FROM calendario c
ORDER BY c.giorno;
risultati
tabella festività che crei tu
+----+------------------+------------+-----------+
| id | nome | data | tipo |
+----+------------------+------------+-----------+
| 1 | CAPODANNO | 2025-01-01 | FISSO |
| 2 | EPIFANIA | 2025-01-06 | FISSO |
| 3 | LIBERAZIONE | 2025-04-25 | FISSO |
| 4 | FESTA DEL LAVORO | 2025-05-01 | FISSO |
| 5 | REPUBBLICA | 2025-06-02 | FISSO |
| 6 | FERRAGOSTO | 2025-08-15 | FISSO |
| 7 | TUTTI I SANTI | 2025-11-01 | FISSO |
| 8 | IMMACOLATA | 2025-12-08 | FISSO |
| 9 | NATALE | 2025-12-25 | FISSO |
| 10 | SANTO STEFANO | 2025-12-26 | FISSO |
| 11 | PASQUA | 2025-12-26 | VARIABILE |
| 12 | PASQUETTA | 2025-12-26 | VARIABILE |
| 13 | scolastico | 2025-01-01 | inizio |
| 14 | scolastico | 2025-07-15 | fine |
| 15 | scolastico | 2025-09-15 | inizio |
| 16 | scolastico | 2025-12-31 | fine |
| 17 | estivo | 2025-07-16 | inizio |
| 18 | estivo | 2025-09-14 | fine |
+----+------------------+------------+-----------+
tabella configurazione corse che crei tu
+----+-------------+--------------+
| id | tipo_giorno | numero_corse |
+----+-------------+--------------+
| 1 | SCOLASTICO | 5 |
| 2 | ESTIVO | 3 |
| 3 | FESTIVO | 2 |
+----+-------------+--------------+
tabella che mi fornisce le date di scadenza del periodo invernale/estivo
+------------+-------------+------------+
| nome | data_inizio | data_fine |
+------------+-------------+------------+
| scolastico | 2025-01-01 | 2025-07-15 |
| scolastico | 2025-09-15 | 2025-12-31 |
| estivo | 2025-07-16 | 2025-09-14 |
+------------+-------------+------------+
tabella calendario generato in automatico.
+------------+------------+--------------+
| giorno | servizio | numero_corse |
+------------+------------+--------------+
| 2025-01-01 | FESTIVO | 2 |
| 2025-01-02 | SCOLASTICO | 5 |
| 2025-01-03 | SCOLASTICO | 5 |
| 2025-01-04 | SCOLASTICO | 5 |
| 2025-01-05 | FESTIVO | 2 |
| 2025-01-06 | FESTIVO | 2 |
| 2025-01-07 | SCOLASTICO | 5 |
| 2025-01-08 | SCOLASTICO | 5 |
| ... | ... | ... |
| 2025-12-28 | FESTIVO | 2 |
| 2025-12-29 | SCOLASTICO | 5 |
| 2025-12-30 | SCOLASTICO | 5 |
| 2025-12-31 | SCOLASTICO | 5 |
+------------+------------+--------------+
io l'ho generato annuale ma tu puoi passare i parametri tramite php a mysql.
considera che fa tutto lato mysql, php passa solo i valori data inizio e data fine del calendario da generare.