Determinazione data

di pierpippo il
42 risposte

Salve a tutti.

devo determinare se avendo una data in $data, essa è festiva o feriale.

Ho letto di creare una tabella sql e ci metto tutte le date che corrispondono a festività fisse ok,

per poi estrarle con una select per ottenere un array di date e infine faccio il confronto per vedere se il valore di $data rientra tra quelle presenti in array.

Il problema è che nella tabella devo sempre andare a inserire nuove date di anno in anno perchè la $data è un valore dinamico e cambia quotidianamente. 

Allora ho letto che si può creare la tabella mettendo mese e giorno delle date festive in colonne separate, senza la colonna anno.

Quando, quando le devo estrarre posso concatenarle e usare CAST per ottenere una data con anno dinamico diciamo e valori fissi per mese e giorno.

Una cosa cosi insomma.

SELECT 
    nome_festivita,
    CAST(CONCAT('2026', '-', mese, '-', giorno) AS DATE) AS data_festivita
FROM Festivita
ORDER BY mese, giorno;

Il dinamismo dell'anno lo posso ottenere inserendo la query in un blocco php e sostituendo 'anno' con $anno estrapolato dallo stesso valore che ho dalla variabile $data, oggetto del confronto per stabilire se coincide con una delle date della tabella 'festività'.

Vi pare corretto o ci sono alternative migliori?

Buona giornata 

Filippo P.

42 Risposte

  • In Italia ci sono 12 +1 festività e una ricade sempre di domenica
    civili e religiose:
    Capodanno (1º gennaio)
    Epifania (6 gennaio)
    Lunedì dell'Angelo / Pasquetta (variabile, il giorno dopo Pasqua)
    Anniversario della Liberazione (25 aprile)
    Festa del Lavoro (1º maggio)
    Festa della Repubblica (2 giugno)
    Assunzione di Maria / Ferragosto (15 agosto)
    Tutti i Santi (1º novembre)
    Immacolata Concezione (8 dicembre)
    Santo Natale (25 dicembre)
    Santo Stefano (26 dicembre) 
    Santo Patrono (variabile)
    A questi dati aggiungi
    Giorni estivi dal
    Giorni estivi al
    Giorni invernali dal
    Giorni invernali al
    Totale 17 record di cui 10 fissi e 7 da aggiornare di anno in anno
    Lanci una update ed hai i dati aggiornati all'anno in corso (10 minuti per scriverla 1 secondo per eseguirla)
    Controlli che non sia una domenica (Pasqua non fa testo in quanto sempre domenica)
    Se non è domenica controlli che non sia in elenco tra le prime 12 (13 se consideri il santo Patrono 14 con il santo protettore se applicato)
    Poi verifichi in quale periodo ricade estivo/invernale
    Fai una stored procedure in modo da fare elaborare il tutto a mysql così che il PC locale invia la Richiesta senza elaborare nulla e il server ti ritorna tutti i dati necessari (magari già in tabella).

    Per la.pasqua nel.post precedente ti ho scritto come ricavarla ma a te serve giorno di pasqua+1 ossia pasquetta. 

    Per le date variabili puoi anche non metterla in tabella e sfruttare la funzione che restituisce la pasqua e aggiungi un giorno per la pasquetta.

  • Perfetto..... o meglio... 

    Sarà perfetto quando mi sarò andato a studiare come si realizza una stored procedure. 

    Quindi devo fare cmq una tabella "festivita" con le date festive che non sono domeniche (per Fortuna le festività locali dovute al patrono nn vengono considerate) .

    La stored procedure servirebbe solo per automatizzare la update sulla tabella per aggiornare le date di anno in anno.  Se non ho capito male. 

    Vabe un passo per volta:

    Preparo la tabella fisica e poi la stored procedure. 

    Grazie. 

    Filippo P. 

  • 18/06/2026 - pierpippo ha scritto:

    La stored procedure servirebbe solo per automatizzare la update sulla tabella per aggiornare le date di anno in anno.  Se non ho capito male. 

    No quella è una semplicissima update

    Update tabella campi... Valori... (Pasqua+1) Where descrizione=pasquetta

    Gli altri sono fissi.

    La tabella ti permette di inserire giorni particolari senza intervenire sul codice. Aggiungi festivi o casi particolari e il programma funziona sempre.

    Perché vuoi sapere se il giorno è feriale, festivo, estivo o invernale?

    Avrai una tabella che mette in relazione le corse in funzione del tipo di giorno.

    Spiega cosa vuoi fare. Nel precedente usavi il tipo di giorno? Se associ corse ad autisti ed è festa hai 3 corse e 2 autisti se feriale 4 corse e 3.autisti se invernale 5 corse e 4 autisti ecc... O usi n' Array identici o usi una tabella da relazionerei (join) e scrivere 1/8 del codice necessario.

  • Dopo aver capito come far funzionare la clausola not exists, 

    Son tornato allo script in cui devo determinare a monte se la data relativa ai servizi da registrare/assegnare, rientra nel periodo invernale o estivo, in primis, 

    Poi se è domenica, e se coincide con le feste fisse. 

    Ora davvero non riesco, ma domani mattina posto la tabella che elenca le corse, così facciamo il punto sulle colonne che la caratterizzano. 

    La mia idea verge su uno script che ho improntato che si chiama "selettore-corse. php", dove intendo  determinare vari parametri relativi al valore di $data_servizio. 

    Poi con varie condizioni if... sulla base di questi parametri, imposto differenziate query select sulla tabella "corse", tutte con la loro clausola not exists, così da avere un dinamico risultato nella variabile $risultato_select. 

    Cmq domani mattina con calma posto la bozza dello script e della tabella, così sarà più facile capire cosa voglio ottenere. 

    Grazie e Buon notte. 

    Filippo P.

  • 19/06/2026 - pierpippo ha scritto:

    La mia idea verge su

    Stai usando il verbo sbagliato... 

    Vergere allontana, devia da...

    Aspetto la tabella, vediamo.se.si può adattare il modello che usavo.ai tempi delle eznalubma... :))

  • 19/06/2026 - sihsandrea ha scritto:

    Stai usando il verbo sbagliato... 

    Vergere allontana, devia da...

    Verge : terza pers sing verbo vergere

    Vergere : piegarsi verso, volgere al...

    Cmq, non importa.

    Questa è la tabella dove vengono registrate tutte le corse che sono svolte quotidianamente.

    MariaDB [gbgarage_test]> describe gbgar_corse;
    +--------------+------------------------------------------------------+------+-----+---------+-------+
    | Field        | Type                                                 | Null | Key | Default | Extra |
    +--------------+------------------------------------------------------+------+-----+---------+-------+
    | ID_CORSA     | int(3)                                               | NO   | PRI | NULL    |       |
    | TABELLA      | varchar(7)                                           | YES  |     | NULL    |       |
    | PERIODO      | enum('estivo','invernale')                           | YES  |     | NULL    |       |
    | LINEA        | varchar(50)                                          | YES  |     | NULL    |       |
    | PARTENZA     | varchar(20)                                          | YES  |     | NULL    |       |
    | ORARIO_CORSA | time                                                 | YES  |     | NULL    |       |
    | ARRIVO       | varchar(20)                                          | YES  |     | NULL    |       |
    | FINE_CORSA   | time                                                 | YES  |     | NULL    |       |
    | TEMPO_CORSA  | time                                                 | YES  |     | NULL    |       |
    | KM           | float                                                | YES  |     | NULL    |       |
    | FREQUENZA    | enum('feriale','scolastica','festiva','giornaliera') | YES  |     | NULL    |       |
    | ECCEZIONI    | varchar(50)                                          | YES  |     | NULL    |       |
    +--------------+------------------------------------------------------+------+-----+---------+-------+
    12 rows in set (0,002 sec)


    Non tutte le colonne servono allo script di assegnazione delle corse, anzi potrei dividerle spostando  i campi tempo_corsa, km, e fine_corsa in una tabella corse_detail... ma per ora nn importa. Le colonne che prelevo per la tendina del form col quale vengono registrati e quindi assegnati i servizi sono le colonne id_corsa,linea, partenza e orario_corsa .

    Lo script  del file select_corse.php che dovrebbe appunto alla fine andare a determinare la variabile $servizi_da_svolgere è questo:

    session_start();
    $data_servizio = $_SESSION['data'];
    $inizio_invernale = $_SESSION['inizio_invernale'];
    $fine_invernale = $_SESSION['fine_invernale'];
    $inizio_estivo = $_SESSION['inizio_estivo'];
    $fine_estivo = $_SESSION['fine_estivo'];
    
    //DETERMINAZIONE DELLA DATA
    
    if($data_servizio>=$inizio_invernale && $data_servizio<=$fine_invernale){
           $orario_in_vigore="invernale";
    }else{
           $orario_in_vigore="estivo";
    }
    
    
    if($orario_in_vigore==="invernale"){
           $query_corse_sql = 
           "SELECT id_corsa,linea,partenza,DATE_FORMAT(orario_corsa,'%H:%i') AS orario_corsa 
           FROM gbgar_corse C
           WHERE NOT EXISTS(
           SELECT 1 FROM gbgar_serv_master M
           JOIN gbgar_serv_detail D ON M.id_master=D.id_master
           WHERE D.id_corsa=C.id_corsa
           AND C.periodo='invernale' 
           AND C.frequenza='scolastica'
           AND M.data='2026-06-06');";
           $servizi_da_svolgere = $Conn->query($query_corse_sql);
    }elseif($orario_in_vigore==="estivo"){
           $query_linee_sql = "SELECT id_corsa,linea,partenza,DATE_FORMAT(orario_corsa,'%H:%i') AS orario_corsa FROM gbgar_corse WHERE periodo='estivo';";
           $servizi_da_svolgere = $Conn->query($query_linee_sql);
    }elseif ($servizi_da_svolgere == FALSE){
           die("Errore nell'esecuzione della query:" . $query_linee_sql);
           }
           
    
    ?>

    Per ora esiste solo la query che viene eseguita nel caso sia in vigore l'orario invernale ed è condizionata anche dal prelevare le corse scolastiche.

    Il valore di m.data è definito in maniera statica al momento ma in teoria  dovrebbe essere la variabile $data_servizio.... ma questi sono solo test.

    Per ora.

    Ma oltre a stabilire $orario_in_vigore devo stabilire che la data non sia festiva, feriale, giornaliera o scolastica.

    scolastica= giorni feriali di interesse scolastico

    giornaliera = tutti i giorni a prescindere

    feriale = giorni feriali in periodo non scolastico (periodo natalizio e pasquale)

    festiva = domeniche + giorni rossi del calendario italiano (1/1, 6/1, etc....)

    La tabella delle date festive la preparo ... inizio a prepararla.

    per la cronaca questo è la porzione di codice che mi realizza la tendina.

    Ovvio che a sto punto la variabile $servizi_da_svolgere che è il risultato della mia select sulla tabella "gbgar_corse" è bella che definita. Qui non mi cambia nulla insomma a prescindere dal giorno cui si riferiscono le corse assegnate. Il lavoro affinchè quella variabile porti i dati corretti è da fare a monte appunto sul file select_corse.php 

    <div class="field">
             <label for="servizi-tpl">Linee da svolgere</label>
             <select class="listserv" name='servizi-tpl[]'multiple>
             <option value=''>Seleziona il servizio</option>
             <?php
             while ($riga = $servizi_da_svolgere -> fetch_assoc()) {
    			$corsa_inserita = $riga['linea'].'--'.$riga['partenza'].'--'.    $riga['orario_corsa'];
             $id_corsa = $riga['id_corsa'];
    			echo"
             <option value='$id_corsa'>
    			$corsa_inserita
             </option>";
             }?>
             </select>
          </div

    Bene, sperando che questi ti aiuti a capire cosa intendo fare, buona giornata e buon lavoro a tutti.

    Filippo P 

  • Così, a livello di conoscenza vorrei informarvi che da noi in Friuli Venezia Giulia ci sono delle giornate (normalmente 3 giorni consecutivi) che la regione decide di anno in anno di assegnare come festività, in particolare per le strutture scolastiche pubbliche.

    Quest'anno sono state definite tra 8 e il 10 Febrraio (Carnevale).

  • 19/06/2026 - Delphinium ha scritto:

    Così, a livello di conoscenza vorrei informarvi che da noi in Friuli Venezia Giulia ci sono delle giornate (normalmente 3 giorni consecutivi) che la regione decide di anno in anno di assegnare come festività, in particolare per le strutture scolastiche pubbliche.

    Quest'anno sono state definite tra 8 e il 10 Febrraio (Carnevale).

    Per questo i dati vanno in tabella, basta aggiungerli et volia.

    Potrebbero esserci anche restrizioni ambientali, lutti cittadini ecc...

    Pierpippo, una tabella è poco su cui lavorare, il tempo di spolverare la vecchia gestione adattarla e ti faccio sapere.

  • 18/06/2026 - sihsandrea ha scritto:

    In Italia ci sono 12 +1

    son diventate 13+1. C'è anche San Francesco il 4 di ottobre dal 2026. Cadrà di domenica quindi poco varia, ma ci sarà nel futuro.

  • 18/06/2026 - sihsandrea ha scritto:

    A questi dati aggiungi
    Giorni estivi dal
    Giorni estivi al
    Giorni invernali dal
    Giorni invernali al

    Per quanto riguarda i periodi invernale e estivo, ho già impostato la tabella seguente:

    SELECT * FROM gbgar_scad_periodo;
    +------+------------+------------+------------+------------+
    | id   | start_inv  | end_inv    | start_est  | end_est    |
    +------+------------+------------+------------+------------+
    |    1 | 2025-09-15 | 2026-06-06 | 2026-06-07 | 2026-09-14 |
    +------+------------+------------+------------+------------+
    1 row in set (0,001 sec)
    

    Questa tabella è aggiornabile attraverso dei campi di un form, i cui dati, se compilati (quando serve aggiornarle), vengono inviati al seguente script che fa l'update.

    <?PHP ...
    
    
    //preparazione aggiornamento tabella sql "gbgar_scad_periodo"
                $fields = [];
                $params = [];
                $types = "";
    
                if(!empty("$inizio_invernale")){    
                $fields[] = "start_inv=?";
                $params[] = $inizio_invernale;
                $types .= "s";
                }
                if(!empty("$fine_invernale")){    
                $fields[] = "end_inv=?";
                $params[] = $fine_invernale;
                $types .= "s";
                }
                if(!empty("$inizio_estivo")){
                $fields[] = "start_est=?";
                $params[] = $inizio_estivo;
                $types .= "s";
                }
                if(!empty("$fine_estivo")){
                $fields[] = "end_est=?";
                $params[] = $fine_estivo;
                $types .= "s";
                }
                if(empty($fields)){
                    echo"<div class='risposta'>
                        Date periodicità orari non aggiornate. Restano valide quelle attualmente impostate
                </div>";
                };
                $params[]= $id_scad_impostate;
                $types .= "i";
    
                $set = implode(",", $fields);
                $query_update = "UPDATE gbgar_scad_periodo SET $set WHERE id=?;";
                $stmt = $Conn->prepare($query_update);
                $stmt->bind_param($types, ...$params);
                if($stmt->execute()){
                    echo"<div class='risposta'>Date modificate con successo !</div>";
                    }else{echo"<div class='risposta'>Errore durante la modifica". $stmt->error ."</div>";
                }
            }if(!isset($imposta_periodo)){
                echo"<div class='risposta'>Le periodicità restano invariate</div>";
            }    
        ?>

    Ora sto preparando la tabella "gbgar_festivita" dove inserisco tutte le date festive fisse del 2026, poi però devo capire meglio come va impostata la stored procedure per l'aggiornamento delle date negli anni successivi.

    Va beh intanto io la tabella "gbgar_festivita" l'ho fatta cosi:

    describe gbgar_festivita;
    +-------------+-------------+------+-----+---------+----------------+
    | Field       | Type        | Null | Key | Default | Extra          |
    +-------------+-------------+------+-----+---------+----------------+
    | ID_FESTA    | int(2)      | NO   | PRI | NULL    | auto_increment |
    | DESCRIZIONE | varchar(25) | NO   |     | NULL    |                |
    | GIORNO      | date        | NO   |     | NULL    |                |
    +-------------+-------------+------+-----+---------+----------------+
    3 rows in set (0,001 sec)
    

    Spero sia impostata bene perchè ora mi metto a popolarla.

    Buona giornata.

    Filippo P.

  • 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');
    la fai una volta sola
    
    
    +----+------------------+------------+-----------+
    | 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 |
    +----+------------------+------------+-----------+
    
    
    
    
    poi ogni anno
    
    
    -- Aggiorna le festività fisse
    UPDATE festivita
    SET data = DATE_FORMAT(CONCAT(YEAR(CURDATE()), '-', MONTH(data), '-', DAY(data)), '%Y-%m-%d')
    WHERE tipo = 'FISSO';
    -- Aggiorna Pasqua e Pasquetta
    UPDATE festivita
    SET data = :D_pasqua
    WHERE NOME = 'PASQUA';
    UPDATE festivita
    SET data = :D_Pasquetta
    WHERE NOME = 'PASQUETTA';
    SELECT * FROM festivita;
    
    
    passi il parametro tipo data 
    
    D_pasqua=easter_date(annodaconsiderare) e D_Pasquetta (D_pasqua+1)
    
    
    tutto lato MySql.
    
    
    
    RISULTATO
    +----+------------------+------------+-----------+
    | id | nome             | data       | tipo      |
    +----+------------------+------------+-----------+
    |  1 | CAPODANNO        | 2026-01-01 | FISSO     |
    |  2 | EPIFANIA         | 2026-01-06 | FISSO     |
    |  3 | LIBERAZIONE      | 2026-04-25 | FISSO     |
    |  4 | FESTA DEL LAVORO | 2026-05-01 | FISSO     |
    |  5 | REPUBBLICA       | 2026-06-02 | FISSO     |
    |  6 | FERRAGOSTO       | 2026-08-15 | FISSO     |
    |  7 | TUTTI I SANTI    | 2026-11-01 | FISSO     |
    |  8 | IMMACOLATA       | 2026-12-08 | FISSO     |
    |  9 | NATALE           | 2026-12-25 | FISSO     |
    | 10 | SANTO STEFANO    | 2026-12-26 | FISSO     |
    | 11 | PASQUA           | 2026-04-05 | VARIABILE |
    | 12 | PASQUETTA        | 2026-04-05 | VARIABILE |
    +----+------------------+------------+-----------+
    
    puoi metterla come operazione pianificata su mysql al 01/01 dell'anno.

    sarebbe utile utilizzare il minor numero di join mantenendo la stessa struttura usata per le festività. 

    20/06/2026 - pierpippo ha scritto:

    Per quanto riguarda i periodi invernale e estivo, ho già impostato la tabella seguente:

    SELECT * FROM gbgar_scad_periodo;
    +------+------------+------------+------------+------------+
    | id   | start_inv  | end_inv    | start_est  | end_est    |
    +------+------------+------------+------------+------------+
    |    1 | 2025-09-15 | 2026-06-06 | 2026-06-07 | 2026-09-14 |
    +------+------------+------------+------------+------------+
    1 row in set (0,001 sec)
    
    +----+------------------+------------+-----------+
    | id | nome             | data       | tipo      |
    +----+------------------+------------+-----------+
    | 13 | scolastico       | 2026-01-01 | inizio    |
    | 14 | scolastico       | 2026-07-15 | fine      |
    | 15 | scolastico       | 2026-09-15 | inizio    |
    | 16 | scolastico       | 2026-12-31 | fine      |
    | 18 | estivo           | 2026-07-16 | inizio    |
    | 19 | estivo           | 2026-09-14 | fine      |
    +----+------------------+------------+-----------+

    scolastico e invernale non so come le consideri, secondo me coincidono, vedi tu.

    caso mai utilizza l'id come priorità i scelta o aggiungi un campo di preferenza.

    l'aggiornamento, visto che si possono considerare fissi segue la regola di aggiornamento delle festività.

    la tabella ti serve per filtrare le corse in base al periodo o giorno.

    ora vedo come si possono organizzare i dati per automatizzare il tutto. il tempo di adattare le tabelle che ho conservate.

  • 20/06/2026 - sihsandrea ha scritto:

    scolastico e invernale non so come le consideri, secondo me coincidono, vedi tu.

    In realtà non coincidono esattamente.

    Ovviamente non ci sono giorni scolastici nel periodo estivo, questo sicuro, visto che l'orario invernale inizia e finisce in coincidenza con l'inizio ufficiali dell'anno scolastico, tuttavia, dentro il periodo settembre-giugno, ci sono giorni feriali che possono essere non scolastici .

    Tuttavia faccio fatica davvero a venirti dietro.

    20/06/2026 - sihsandrea ha scritto:

    l'aggiornamento, visto che si possono considerare fissi segue la regola di aggiornamento delle festività.

    per quanto riguarda la tabella che mi fornisce le date di scadenza del periodo invernale/estivo,

    lo avevo gia previsto.

    Perchè quando ho impostato il form in realtà ne ho due .

    Il primo lo ho pensato appunto per impostare la data di riferimento per l'assegnazione dei servizi.

    questo è lo script del file 

    <body>
    
    <div class="titolo_pagina">IMPOSTA LA DATA</div>
        <div class="descrizione_pagina">Inserisci la data relativi ai servizi che andrai a inserire</div>
    
        <div class="form">
            <form action="" method="post">
                <div class="field">
                    <label for="imposta_periodo">Spunta se occorre aggiornare l'orario invernale/estivo</label>    
                    <input class="ck_box" type="checkbox" name="imposta_periodo" id="imposta_periodo">
                </div>
                <div class='hidden' id='periodo'>
                    <div class="field">
                    <label for="inizio_invernale">Aggiorna data di inzio <br> dell'orario invernale</label>
                    <input class='data_orario' type="date" name="start_inv">
                    </div>
                    <div class="field">
                    <label for="fine_invernale">Aggiorna data di fine <br> dell'orario invernale</label>
                    <input class='data_orario' type="date" name="end_inv">
                    </div>
                    <div class="field">
                    <label for="inizio_estivo">Aggiorna data di inzio  <br> dell'orario estivo</label>
                    <input class='data_orario' type="date" name="start_est">
                    </div>
                    <div class="field">
                    <label for="inizio_estivo">Aggiorna data di fine  <br> dell'orario estivo</label>
                    <input class='data_orario' type="date" name="end_est">
                    </div>
                </div>
                <div class="field">
                    <label for="data">Inserisci data servizio</label>
                    <input type="date" name="data" id="data" required>
                    <input name="invia" type="submit" id="" value="Conferma">
                </div>
            </form>
    
            <script>
            const checkBox = document.getElementById('imposta_periodo');
            const scadenzeOrario = document.getElementById('periodo');
    
            checkBox.addEventListener('change', function(){
            const selected = this.checked;
    
            if(selected===false){
                scadenzeOrario.classList.add('hidden');
            }if(selected===true){
                scadenzeOrario.classList.remove('hidden');
            }
            });
        </script>
        </div>
    
        <?php 
    
            //connessione al database sql-----
            require_once('../database_connection.php');
            //Si include il file del formattatore per la data in formato italiano
            include'../partial/format-date.php';
            //--------------------------------
    
            $inizio_invernale = $_POST["start_inv"] ?? null;
            $fine_invernale = $_POST["end_inv"] ?? null;
            $inizio_estivo = $_POST["start_est"] ?? null;
            $fine_estivo = $_POST["end_est"] ?? null;
            $imposta_periodo = $_POST["imposta_periodo"] ?? null;
            $data = $_POST["data"] ?? null;
            $id_scad_impostate = 1;
        
    
            if($imposta_periodo === "on" || $imposta_periodo === "off"){
    
                //preparazione aggiornamento tabella sql "gbgar_scad_periodo"
                $fields = [];
                $params = [];
                $types = "";
    
                if(!empty("$inizio_invernale")){    
                $fields[] = "start_inv=?";
                $params[] = $inizio_invernale;
                $types .= "s";
                }
                if(!empty("$fine_invernale")){    
                $fields[] = "end_inv=?";
                $params[] = $fine_invernale;
                $types .= "s";
                }
                if(!empty("$inizio_estivo")){
                $fields[] = "start_est=?";
                $params[] = $inizio_estivo;
                $types .= "s";
                }
                if(!empty("$fine_estivo")){
                $fields[] = "end_est=?";
                $params[] = $fine_estivo;
                $types .= "s";
                }
                if(empty($fields)){
                    echo"<div class='risposta'>
                        Date periodicità orari non aggiornate. Restano valide quelle attualmente impostate
                </div>";
                //return;
                };
    
                $params[]= $id_scad_impostate;
                $types .= "i";
    
                $set = implode(",", $fields);
                $query_update = "UPDATE gbgar_scad_periodo SET $set WHERE id=?;";
                $stmt = $Conn->prepare($query_update);
                $stmt->bind_param($types, ...$params);
                if($stmt->execute()){
                    echo"<div class='risposta'>Date modificate con successo !</div>";
                    }else{echo"<div class='risposta'>Errore durante la modifica". $stmt->error ."</div>";
                }
            }if(!isset($imposta_periodo)){
                echo"<div class='risposta'>Le periodicità restano invariate</div>";
            }    
        ?>
        
        <?php
    
        //Blocco per prelievo date periodi dal database
    
        $select_sql = "SELECT start_inv,end_inv,start_est,end_est  FROM gbgar_scad_periodo;";
    
        $risultato_select=$Conn->query($select_sql);
    	if($risultato_select == FALSE){
    	die("Errore nell'esecuzione della query: " . $select_sql);
    	}
    
        while($periodi=$risultato_select->fetch_assoc()){
            $inizio_invernale=$periodi["start_inv"];
            $fine_invernale=$periodi["end_inv"];
            $inizio_estivo=$periodi["start_est"];
            $fine_estivo=$periodi["end_est"];
        }
        ?>
    
        <?php
            //inseriamo nella variabile di sessione i valori delle date che arrivano dal form.
            $_SESSION['data'] = $data;
            $_SESSION['inizio_invernale'] = $inizio_invernale;
            $_SESSION['fine_invernale'] = $fine_invernale;
            $_SESSION['inizio_estivo'] = $inizio_estivo;
            $_SESSION['fine_estivo'] = $fine_estivo;
            
        ?>
    
        <?php
        
            $data_inizio_inverno = new DateTime($inizio_invernale);
            $data_fine_inverno = new DateTime($fine_invernale);
            $data_inizio_estate = new DateTime($inizio_estivo);
            $data_fine_estate = new DateTime($fine_estivo);
            
    
            
            echo"
                <div class='risposta risp_var'>
                    L'orario invernale attuale è compreso tra il <span>". $formatter->format($data_inizio_inverno) ."</span>
                    e il <span>". $formatter->format($data_fine_inverno) ."</span> ;<br> 
                    L'orario estivo è compreso tra il <span>". $formatter->format($data_inizio_estate) ."</span>
                    e il <span>". $formatter->format($data_fine_estate) ."</span> .
                </div>
            ";
        ?>    
    
        <?php
            if(isset($data)){
            $data_grezza = new DateTime($data);}
    
            if(!empty ($_SESSION['data'])){
            echo "<div class='risposta'> OK ! I servizi che verranno registrati saranno riferiti alla data <br><b><u>" . $formatter->format($data_grezza) . 
            " ! </b></u>"; 
            echo"<br> Vai alla maschera di gestione servizi attraverso il link sottostante </div>";
            }
            else{echo"<div class='risposta'> Non hai ancora impostato la data dei servizi da assegnare!  </div>";}
        ?>
        <div class="bottone_new_srv">
            <a href="../gestione-servizi/form-gest_serv-dev.php">Vai alla maschera di gestione servizi</a>
        </div>
    </body>
    </html>

    Il form vedi ha una parte che con un breve blocco js lo faccio comparire o scomparire se serve aggiornare le date di inizio/fine   del periodo invernale o estivo.

    Poi se quei campi vengono effettivamente compilati nel form viene aggiornata la tabella gbgar_scad_periodo.

    Altrimenti, se non serve aggiornarle non si attiva il ceck box, non si compilano i campi che restano nascosti, le date scadenza periodi restano quelle precedenti  e in questo caso nel form si compila solo il campo data_servizio che resta valido per tutte le compilazioni successive finché non lo si va a modificare .(click sulla input che rimanda al form di cui sopra.)

    Questo dovrebbe andare bene ...

    perchè devo andare a scombinare tutto?

    Ora come ho fatto la tabella delle scadenze devo fare quella delle feste fisse e variabili.

    imposto la tabella festività secondo il tuo suggerimento.

    vedo come fare per organizzare la pianificazione annuale di aggiornamento delle dateora  delle date .

    Poi tiro su le date e imposto le variabili che mi servono per definire i parametri relativi a $data_servizio.

     Per ora vi saluto.

    grazie a tutti

    Filippo P

  • 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.

  • Non ho  capito  mica tanto. 

    Io ho bisogno di procedere diversamente da quanto faresti tu.

    Quindi alt. Torniamo alla tabella festività:

    la tabella festività ha bisogno di una colonna 'tipo' perchè?

    Se penso che avere quella colonna è propedeutico per la update annuale sulle date della tabella, penso  giusto?

    quindi correggo la mia tabella e la faccio cosi:

    +----+------------------+------------+-----------+
    | 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 |
    +----+------------------+------------+-----------+

    Queste query invece per aggiornarla ....

    non mi sono chiarissime, ti ho messo quanto ho capito dopo ogni query.

    -- Aggiorna le festività fisse
    UPDATE festivita
    SET data = DATE_FORMAT(CONCAT(YEAR(CURDATE()), '-', MONTH(data), '-', DAY(data)), '%Y-%m-%d')
    WHERE tipo = 'FISSO';
    
    -- Allora qua la update concatena l'anno corrente al mese e il giorno che restano uguali al precedente e infatti la where va sui record delle festivita fisse. giusto?
    
    -- Aggiorna Pasqua e Pasquetta
    UPDATE festivita
    SET data = :D_pasqua     
    WHERE NOME = 'PASQUA';
    
    UPDATE festivita
    SET data = :D_Pasquetta
    WHERE NOME = 'PASQUETTA';
    
    sintassi a me sconosciuta al momento ma immagino che pre imposti dei segnaposti e poi i parametri vengono inseriti dopo con l'istruzione easter_date
    MA se queste vanno pianificate per essere eseguite in automatico, come fa sql a sapere che anno deve perendere in considerazione?
    
    buio.
    
    SELECT * FROM festivita;
    
    --passi il parametro tipo data  
    
    ......cosa significa? perchè questa select prima di passare il parametro?
    
    
    
    D_pasqua=easter_date(annodaconsiderare) e D_Pasquetta (D_pasqua+1)
    --?? anno da considerare? 
    
    

    Insomma non ho capito mica tanto come devo gestire l'aggiornamento annuale della tabella.

    Booh mi sa che le idee mi si confondono .

    Va be vado intanto a vedermi come si dovrebbero pianificare le update in sql per automatizzarle senza che ci sia una input di qualche tipo da un file php.

Devi accedere o registrarti per scrivere nel forum
42 risposte