Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    487

    differenza tra date lavorative

    ciao, io ho un campo date chiamato data_validazione

    vorrei fare una query in cui dico :se oggi è <= di 5 giorni lavorativi dal campo data_validazione allora fai qualcosa.

    io ho risolto solo la prima parte,cioè se oggi è <= di 5 giorni in questo modo:

    AND DATEDIFF(CURDATE(),data_validazione)<=5

    solo che non controllo se sono giorni lavorativi(in poche parole voglio escludere dal conteggio il sabato e la domenica)
    Vivi intensamente, muori giovane e sarai un cadavere di bell' aspetto.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Ciao. Direttamente tramite mysql non so se lo puoi fare. Tempo fa avevo scritto questa funzioncina che magari può tornarti utile.
    Inserendo una data e il numero di giorni lavorativi restituisce il giorno in cui cadrà l'ultimo giorno lavorativo. Una volta che hai questa data puoi usarla per la query.

    Codice PHP:
    function giorniLavorativi($giornoInizio,$meseInizio,$annoInizio,$lavorativi)
    {
        
    // Calcolo del giorno di Pasqua fino all'ultimo anno valido
        
    for ($i=2006$i<=2037$i++)
        {
        
    $pasqua date("Y-m-d"easter_date($i));
        
    $array_pasqua[] = $pasqua;
        }
        
    //var_dump($array_pasqua);

        // Calcolo le rispettive pasquette
        
    foreach($array_pasqua as $pasqua)
        {
        list (
    $anno,$mese,$giorno) = explode("-",$pasqua);
        
    $pasquetta mktime (0,0,0,date($mese),date($giorno)+1,date($anno));
        
    $array_pasquetta[] = $pasquetta;
        }

        
    // Mi calcolo il timestamp della mia data di partenza
        
    $tsData mktime(0,0,0,$meseInizio,$giornoInizio,$annoInizio);

        
    // questi giorni son sempre festivi a prescindere dall'anno
        
    $giorniFestivi = array("01-01",
                               
    "01-06",
                               
    "04-25",
                               
    "05-01",
                               
    "06-02",
                               
    "08-15",
                               
    "11-01",
                               
    "12-08",
                               
    "12-25",
                               
    "12-26",
                               );

        
    $i 0;
        while (
    $i<$lavorativi)
        {
          
    $giorno_data date("w",$tsData); //verifico il giorno: da 0 (dom) a 6 (sab)
          
    $mese_giorno date('m-d',$tsData); // confronto con gg sempre festivi
          // Infine verifico che il giorno non sia sabato,domenica,festivo fisso o festivo variabile (pasquetta);        
              
    if ($giorno_data !=&& $giorno_data != && !in_array($mese_giorno,$giorniFestivi) && !in_array($tsData,$array_pasquetta) )
              {
                
    $i++;
              }
          
    $tsData=$tsData+86400;
        } 
    //fine while
        
    $tsData=$tsData-86400;
        
    $giorno_conclusivo date('d-m-Y',$tsData); //converto il timestamp finale nel formato gg-mm-aaaa
        
    return $giorno_conclusivo;
    // fine funzione

    // Richiamo la mia funzione passando nell'ordine 4 parametri:
    // giorno,mese e anno da cui iniziare il conteggio e il numero di gg lavorativi
    echo giorniLavorativi(31,8,2006,5);
    // inserendo 31 agosto 2006 e 5 giorni lavorativi mi restituisce 06/09/2006. 
    Spero ti sia utile.

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    L'ho adattata un attimo. Adesso alla funzione devi passare la tua data di partenza e ti restituisce il numero di giorni lavorativi trascorsi sino ad oggi.
    Tu parlavi solo di sabati e domeniche, questa considera anche le festività "fisse" e quelle variabili come pasqua e pasquetta.

    Codice PHP:
    function giorniLavorativiTraDate($giorno,$mese,$anno)
    {
    $ts_lavorazione mktime(0,0,0,$mese,$giorno,$anno);

    $ts_oggi mktime(0,0,0,date('m'),date('d'),date('Y'));
        for (
    $i=2006$i<=2037$i++){
        
    $pasqua date("Y-m-d"easter_date($i));
        
    $array_pasqua[] = $pasqua;
        }

        foreach(
    $array_pasqua as $pasqua){
        list (
    $anno,$mese,$giorno) = explode("-",$pasqua);
        
    $pasquetta mktime (0,0,0,date($mese),date($giorno)+1,date($anno));
        
    $array_pasquetta[] = $pasquetta;
        }

        
    $giorniFestivi = array("01-01",
                               
    "01-06",
                               
    "04-25",
                               
    "05-01",
                               
    "06-02",
                               
    "08-15",
                               
    "11-01",
                               
    "12-08",
                               
    "12-25",
                               
    "12-26",
                               );

    $trascorsi 0;
    while (
    $ts_lavorazione <= $ts_oggi)
    {
        
    $giorno_lavorazione date("w",$ts_lavorazione); //verifico il giorno: da 0 (dom) a 6 (sab)
        
    $mese_giorno_lavorazione date('m-d',$ts_lavorazione); // confronto con gg sempre festivi
            
    if ($giorno_lavorazione !=&& $giorno_lavorazione != && !in_array($mese_giorno_lavorazione,$giorniFestivi) && !in_array($ts_lavorazione,$array_pasquetta) )
              {
                
    $trascorsi++;
              }
              
    $ts_lavorazione=$ts_lavorazione+86400;
    }

    return 
    $trascorsi;
    }

    echo 
    giorniLavorativiTraDate(20,8,2006); // inserisco una data e mi dice quanti giorni lavorativi a 
                                             // oggi sono trascorsi. Dal 20 agosto a oggi son 9 giorni.
    ?> 

  4. #4

    Re: differenza tra date lavorative

    Originariamente inviato da tespiego
    ciao, io ho un campo date chiamato data_validazione

    vorrei fare una query in cui dico :se oggi è <= di 5 giorni lavorativi dal campo data_validazione allora fai qualcosa.

    io ho risolto solo la prima parte,cioè se oggi è <= di 5 giorni in questo modo:

    AND DATEDIFF(CURDATE(),data_validazione)<=5

    solo che non controllo se sono giorni lavorativi(in poche parole voglio escludere dal conteggio il sabato e la domenica)
    senza valutare le festivita' infrasettimanali su cui ci vorrebbe una tabella calendario da aggiornare anno per anno e limitandosi ad escludere i sabato e le domeniche potresti usare la seguente condizione nel where (vale anche per update e delete ovviamente).

    codice:
    SELECT *
    from tabella
    where 
    data_db <= curdate() - interval 
    (case 
    when weekday(curdate()) between 0 and 4 then 7
    when weekday(curdate()) = 5 then 8
    else 9 end) 
    day
    basta togliere 7 giorni dal lunedi' al venerdi', 8 il sabato e 9 la domenica.

    weekday = 0 lunedi', 1 martedi', .... 5 sabato, 7 domenica

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.