Calcolare differenza temporale tra datetime salvati sui records di una tabella mysql

makcia

Nuovo Utente
24 Ago 2013
8
0
0
Ciao a tutti! Devo calcolare la differenza di ore intercorsa tra le date di inizio riunione presenti in una tabella mysql. Vorrei fare una funzione che estratti i cod id delle riunioni da controllare, mi restituisse quelli che hanno come ora di inizio un tempo inferiore a tot ore da quella precedente. Il mio approccio è il seguente:

PHP:
$sedutedacontrollare = "    SELECT avse_avig_importo,avse_titolo,avse_cod_id,avse_avts_cod_id,avse_inizio,avse_fine
                        FROM    avse_sedute
                        WHERE   avse_cod_id IN (".implode(',',$A).")
                        ORDER BY avse_inizio";

//con questa query ho tirato fuori le riunioni da controllare

$result = mysql_query($sedutedacontrollare) or die(mysql_error($db));
while($row=mysql_fetch_array($result)){
extract($row);

$avse_cod_id2 = ($row['avse_cod_id']);
$avse_inizio = ($row['avse_inizio']);
$datedacontrollare[] = ($avse_inizio); // SE METTO AVSE_COD_ID COME CHIAVE DELL'ARRAY PER PORTARMELO DENTRO LA FUNZIONE diffnumeroore NON MI FA PIU' IL CONTEGGIO DELLE ORE
}

$j = count($datedacontrollare) -2;
$ris = array();
for ($i=0;$i<=$j;$i++) {
    $ris[] = diffnumeroore($datedacontrollare[$i],$datedacontrollare[$i+1]);
}

La funzione che calcola la differenza di ore è facilmente immaginabile.
Il tutto da come risultato in stampa:

PHP:
Array
(
    [0] => 2013-08-18 08:30:00
    [1] => 2013-08-18 10:30:00
    [2] => 2013-08-18 17:30:00
    [3] => 2013-08-20 08:40:00
)

Array
(
    [0] => 0 giorni e 2 ore 
    [1] => 0 giorni e 7 ore 
    [2] => 1 giorni e 15 ore 
)

Quello che però devo fare io mi sfugge e con questo approccio non riesco ad arrivare alla soluzione...
Qualcuno ha qualche suggerimento da darmi?
Grazie in anticipo a tutti!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
non so se ho capito bene quello che vuoi fare, provo a spiegarlo
1) tu definisci un tempo es 2 ore
2) vuoi tirare fuori quelle riunioni che
tempo_inizio_riunione_A + 2 minore di tempo_inizio_riunione_B
o detto in altro modo: la riunione A termina almeno 2 ore prima dell'inizione della B
è così?
se è così e hai un po' di pazienza, provo a tirar fuori qualcosa.
altrimenti fammi sapre cosa esattamente vuoi fare
 

makcia

Nuovo Utente
24 Ago 2013
8
0
0
Ciao!! Sai che finora i tuoi post mi hanno insegnato un sacco di cose?

Comunque la situazione, semplificata per focalizzarci sul problema, è questa:

Ho una tabella con le riunioni e una con gli iscritti alle riunioni. Foreign key su tabella iscritti.

Ad ogni iscritto, per la prima riunione va pagato sempre un corrispettivo, mentre per le altre va pagato ammesso che l'orario di convocazione (inizio) disti più di un tot ore dalla convocazione della riunione precedente a cui ha partecipato. Il tempo deve poter essere modificato dagli utenti dell'applicazione quindi sarà una variabile. Per semplificare possiamo assumere il valore di 4 ore.

La query $sedutedacontrollare estrae già le riunioni di un singolo iscritto che sono quelle da controllare e contiene molti dati fra cui data_inizio e cod_id, fondamentalmente gli unici 2 valori di cui ho bisogno.

Ciò che non riesco a fare e proseguire con lo script in modo che mi ritorni un array con dentro sempre il cod_id della prima riunione più i cod_id di tutte le succcessive che abbiano data inizio maggiore del valore assunto 4 rispetto alla precedente, in modo da poter usare quel risultato per filtrare le riunioni da pagare alla persona in un'altra funzione che valuterà anche molti altri criteri per il pagamento.

Spero di essere riuscito a spiegare bene...

Il tempo è un fattore relativo pertanto "manca sempre" <>== "manca mai"!

Scherzo! Grazie mille se trovi un attimo, non c'è fretta!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
domani sono via, ma intanto dimmi una cosa
le date nei campi data inizio e fine sono formattati così 2013-08-18 08:30:00 cioè YYYY-mm-dd h:i:s ?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao , benvenuto
ne sparo una delle mie
PHP:
<?php

$orari = array
    (
    23 => "2013-08-18 08:30:00",
    36 => "2013-08-18 10:30:00",
    39 => "2013-08-18 17:30:00",
    42 => "2013-08-20 08:40:00"
);
$tempo = 4;
$i = 0;
$data_confronto = "";
$id_da_pagare = array();
foreach ($orari as $id => $data) {
    if ($i == 0) {
        $data_confronto = $data;
        $id_da_pagare[] = $id;
    } else {
        $inizio = new DateTime($data);
        $confronto = new DateTime($data_confronto);
        $diff = $confronto->diff($inizio);
        $ore = $diff->h;
        if ($ore >= $tempo) {
            $id_da_pagare[] = $id;
        }
        $data_confronto = $data;
    }
    $i++;
}
var_dump($id_da_pagare);
?>

ho usato l'array che hai postato, non ho testato, non ho commentato :crying:
 

makcia

Nuovo Utente
24 Ago 2013
8
0
0
Ciao criric grazie mille del benvenuto e della risposta!
Domani guardo la tua idea! Ora mi metto in pausa perchè son qui dalle nove di stamattina e ci vedo triplo! :dipser:
 

makcia

Nuovo Utente
24 Ago 2013
8
0
0
Ciao criric ... per fortuna che l'hai scritto in fretta!
Da solo non ci sarei mai arrivato (mi manca ancora un bel po di pratica con php)!
Passandogli l'array dinamico generato dalle tabelle del mio db funzia che è una meraviglia!
L'unica pecca è che facendo il conteggio solo in ore si verificano i 3 seguenti casi: Assunto che $tempo=4

1 - Se la differenza tra gli orari è solo di qualche ora il sistema è perfetto
2 - Se la differenza tra gli orari è di 2 giorni e 5 ore allora, non considerando i giorni ma solo le ore, 5 > $tempo e la passa correttamente tra le riunioni da pagare
3 - Se la differenza tra gli orari è di 2 giorni e 3 ore allora, non considerando i giorni ma solo le ore, 3 < $tempo e non la passa anche se sono passati 2 giorni

Però una domandina su una piccola parte del tuo codice te la devo fare perchè copiare e incollare senza capire bene tutto non mi diverte e nemmeno rispetta chi ne sa più di me:

PHP:
if ($i == 0) {
    $data_confronto = $data; //valorizzo variabile $data_confronto con il primo orario OK
    $id_da_pagare[] = $id; //valorizzo array $id_da_pagare con cod_id del primo orario in quanto quello va sempre pagato OK
} else {
    $inizio = new DateTime($data); //valorizzo $inizio con $data cioè con tutte le date che rientrano in questa casistica (dalla seconda in poi) OK
    $confronto = new DateTime($data_confronto); //questa valorizza $confronto con tutti gli orari dal primo al penultimo??COME FUNZIONA??

Ora provo a sistemare il discorso degli orari.
Da quello che ho letto mi viene in mente di valorizzare anche giorni, mesi ed anni con $diff->d; $diffm->m; $diffa->y; e poi usare un if sul fatto che siano o meno uguali a 0. Tu che ne dici?

Grazie ancora per il preziosissimo aiuto! :)
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
mesi ed anni con $diff->d; $diffm->m; $diffa->y;
si è vero! non ci avevo pensato
in realtà però si recuperano cosi
PHP:
$giorni = $diff->d;
$mesi = $diff->m
// etc
ma alla fine ci interssano solo i giorni, visto che 1 gg = 24 ore potremmo risolvere cosi
PHP:
$ore = $diff->h;
$ore += ($diff->days * 24);
ho risparato senza testare se non riesci a farlo funzionare giuro che la prossima la testo :fonzie:
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
non avevo fatto caso alla tua domanda nei commenti
$confronto = new DateTime($data_confronto); //questa valorizza $confronto con tutti gli orari dal primo al penultimo??COME FUNZIONA??
in pratica memorizziamo in $confronto la data dell'iterazione precedente per poterla confrontare con la data dell'iterzazione in corso
a fine controlli la rivalorizziamo con l'ultima data
PHP:
$data_confronto = $data;
dimenticavo inoltre di spiegarti dove ho tirato fuori $diff->days : questo parametro ti restituisce i giorni totali a differenza di $diff->d
prova a fare un var_dump di $diff, troverai tutti i parametri che si possono utilizzare
PHP:
var_dump($diff);
 
Ultima modifica:

makcia

Nuovo Utente
24 Ago 2013
8
0
0
Criric tu spari e rispari meglio di Terence Hill in "Lo chiamavano trinità"! Tutto risolto!
Grazie mille (anche per le spiegazioni).
Un grazie anche a borgo italia che mi aveva risposto.
Ciao ragazzi! W mrwebmaster.it!!! :beer:
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
ho visto che ti ha risolto tutto crirc, quindi una sola aggiunta, se devi poi caricare in remoto controlla prima la versione di php che ha il tuo host.
la versione deve essere PHP 5 >= 5.3.0 altrimenti non funzia.
ti fai un piccolo file
PHP:
<?php
phpinfo();
?>
lo chiami phpinfo.php e lo carichi nella root del tuo sito, poi con
www.tuo_sito.it/phpinfo.php
vedi che versione hai
(es il mio host è ancora alla 5.2.3)
 

makcia

Nuovo Utente
24 Ago 2013
8
0
0
Ciao borgo! Si tutto a posto. La versione PHP nel server è 5.4.17 e lavoro direttamente in remoto dunque no problem! Grazie ancora! :fonzie:
 

Storming

Nuovo Utente
12 Dic 2018
4
0
1
Buonasera,
scusate se tiro su questo thread ma non mi sembra sia vietato dal regolamento, se così non fosse scusatemi.
Ho trovato questo argomento perché ho un caso molto simile e già da solo mi ha aiutato moltissimo.
Ma ho un array che mi riporta:
- l'inizio della rinione,
- l'inizio del coffee break,
- la fine del coffee break,
- la fine della riunione.

Riprendendo l'array originale e modificandolo secondo le mie necessità ho questo
PHP:
$orari = array
    (
    23 => "2013-08-18 08:30:00",
    24 => "2013-08-18 09:15:00",
    25 => "2013-08-18 09:25:00",
    26 => "2013-08-18 09:57:00",
    35 => "2013-08-18 17:30:00",
    36 => "2013-08-18 18:10:00",
    37 => "2013-08-18 18:20:00",
    38 => "2013-08-18 19:30:00",
);

Con lo script di Criric riesco a trovare gli inzi di ogni riunione, ma a me serve anche trovare l'orario di fine riunione, nel mio caso quindi dovrei avere uno script che mi riporta oltre al primo array con gli orari di inizio (23 e 35) , anche un array che mi riporti i seguenti id: 26 e 38.

Edit: faccio una piccola rettifica/spiegazione, possono esserci più interruzioni (coffee break) durante la riunione, a me serve trovare l'id precedente l'inzio della riunione successiva (spero si capisca).


Come posso fare?
Grazie a chi mi aiuterà
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
consenti una domanda,
09.00
10.15
10.30
12.00
13.00
15.15
15.45
17.30
sono due riunioni, una al mattino ed una al pomeriggio, oppure
una sola riunione con pausa pranzo ?

si potrebbe fare anche il caso di 2 riunioni al mattino senza pausa ….

credo sia molto difficile creare una regola funzionante per le diverse tipologie di riunioni, ma
forse ciascuna riunione é identificata in modo univoco nel db ( con un id ) che permette di legare tutti gli orari di una singola riunione,
se così fosse, basta estrarre id, min(data), max(data) raggruppate per id

ma forse con i due thread …. non ho capito nulla (perché non ho letto i vecchi post ….)
 

Storming

Nuovo Utente
12 Dic 2018
4
0
1
Con i tuoi orari le riunioni sarebbero 3, una con inizio alle 9 e fine alle 12, una con inizio alle 13 e fine alle 13,45 (con una "timbratura"mancante) e una con inizio alle 17.30 senza la "timbratura" di fine riunione.

Nei post precedenti si parla di un intervallo sicuro tra inizi riunione di almeno di 4 ore.
 

Storming

Nuovo Utente
12 Dic 2018
4
0
1
Non c'è problema, intanto stavo pensando di confrontare i due array e usare prev(), ma devo capire bene come fare
 

Storming

Nuovo Utente
12 Dic 2018
4
0
1
Ho trovato la soluzione ed era abbastanza semplice, riprendendo qui il codice del post di criric (ho cambiato giusto l'array degli id con gli array delle date)
PHP:
$tempo = 4;
$i = 0;
$data_confronto = "";
$data_inizio = array();
$data_fine = array();
foreach ($orari as $id => $data) {
    $precedente =  current($orari);
    if ($i == 0) {
        $data_confronto = $data;
        $data_inizio[] = $data;
        $precedente=reset($orari);
    } else {
        $inizio = new DateTime($data);
        $confronto = new DateTime($data_confronto);
        $diff = $confronto->diff($inizio);
        $ore = $diff->h;
        $ore += ($diff->days * 24);
        if ($ore >= $tempo) {        $precedente =  prev($orari); $data_inizio[] = $data; $data_fine[]=$precedente; $data_fine[]=end($orari); }
        $data_confronto = $data;
       
    } $precedente=next($orari);
    $i++;
}
 
Discussioni simili
Autore Titolo Forum Risposte Data
V Calcolare la differenza tra due date in PHP PHP 1
P Calcolare maschera di sottorete Hosting 0
S Magento 2 - Calcolare una tassa con una regola basata su proprietà di prodotto Magento 0
M [PHP] Calcolare costi su modifica orari PHP 4
diego66 [Javascript] Calcolare giorni lavorativi comprese tra due date Javascript 0
H [PHP] Ciclo per calcolare i chilometri PHP 4
A sito responsive - calcolare l'altezza document di 2 php Ajax 4
M [PHP] Calcolare se due intervalli di tempo si sovrappongono PHP 7
M Come calcolare infinite cifre di pigreco PHP 0
Shyson Calcolare la Pasqua automaticamente Javascript 17
D Ajax per calcolare tempo di permanenza Ajax 14
C Calcolare e formattare con javascript [Form!] Javascript 6
Web Designer Come calcolare l'I.M.U. online gratuitamente Discussioni Varie 0
voldemort Hosting: come calcolare traffico mensile Hosting 0
G Calcolare la somma Javascript 3
N Calcolare dimensione di un file su un server diverso PHP 4
G Calcolare il valore massimo PHP 15
A calcolare prezzo medio Java 1
A calcolare l'età in automatico Javascript 2
JellyBelly Gmap - calcolare distanza fra due maker Javascript 0
G Calcolare ROI banner di AdSense del sito? Google AdSense 2
metalgemini Calcolare i minuti tra 2 celle di formato "ora" Windows e Software 2
B Calcolare Top e Left in base a Risoluzione Classic ASP 11
L Access calcolare ore e minuti MS Access 3
N Calcolare automaticamente un campo in una maschera Database 2
E Query differenza tra tabelle MySQL 5
A differenza tra account email e ISP presenti in blacklist Posta Elettronica 0
W Differenza tra orari PHP 3
S Differenza date record successivi MS Access 7
Gabriele Visioli Differenza tra hosting e hosting WordPress Hosting 4
S Differenza tra le funzioni include () e require ()? PHP 1
T differenza fra mysql xampp e un mysql server Database 0
U [PHP] Differenza tra amministratore e utente PHP 2
M PHP Arrotondamento minuti in differenza tra due Orari PHP 9
Emix [PHP] Differenza Date + Ore PHP 3
S [PHP] Eseguire differenza su dati SQL presenti sulla stessa colonna PHP 1
V [PHP] Differenza reale tra bindParam e bindValue PHP 8
K Certificato SSL (https) gratuito o a pagamento? che differenza c'è? Server Dedicati e VPS 1
andrea.peo Calcolo differenza fra record attivo e precedente PHP 1
G Calcolo differenza valori provenienti da una tabella PHP 0
giap Classi stili/stili per singoli TAG- differenza- HTML e CSS 2
Z Google: qual'è la differenza tra Popolarità e Autorevolezza di un sito? SEO e Posizionamento 1
M Qual'è la differenza tra Server.Transfer e Response.Redirect? ASP.NET 1
Giacomo92 Differenza tra Webmaster e Web designer? Webdesign e Grafica 2
V Differenza tra operatori == e === in javascript? Javascript 1
felino [C#] Differenza tra ClipboardPasted e ClipboardPasting .NET Framework 2
F differenza tra 2 date PHP 5
Monital Differenza tra int smallint etc. Database 5
S Differenza data PHP 1
A Differenza tra anteporre o posporre l'operatore di incremento nel ciclo for Javascript 5

Discussioni simili