Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Differenza tra due datetime

    Sto cercando di realizzare una funzione per calcolare la differenza tra due datetime
    Ma con scarsi risultati per il momento..

    codice:
    <?php 
    	//----------------------------------------------------------------------------------
    	function Dif_Date($value) {
    		$dif_date = NULL;
    		$sys_date_split = NULL;
    		global $dif_date, $sys_date_split;
    		// 2005-09-25 15:37:00
    		$y = substr($value, 0, 4);  // Anno 
    		$m = substr($value, 5, 2);  // Mese
    		$d = substr($value, 8, 2);  // Giorno
    		$h = substr($value, 11, 2);  // Ore
    		$i = substr($value, 14, 2); // Minuti
    		$s = substr($value, 17, 2); // Secondi
    		$sys_date_split = $y . "-|-" . $m . "-|-" . $d . "-|-" . $h . "-|-" . $i . "-|-" . $s . "-|";
    		// mktime(ore, minuti, secondi, mese, giorno, anno)
    		$dif_date = mktime($h-date("H"), $i-date("i"), $s-date("s"), $m-date("m"), $d-date("d"), $y-date("Y"));
    	} // End Dif_Date
    
    	$sys_datetime = date('Y-m-d H:i:s');
    	$data_scadenza = '2005-09-25 15:37:00';
    	Dif_Date($data_scadenza);
    	echo "elementi -----" . $sys_date_split . "
    \n
    \n";
    	echo "attuale ------" . $sys_datetime . "
    \n";
    	echo "scadenza -----" . $data_scadenza . "
    \n";
    	echo "differenza ---" . $dif_date . "
    \n";
    ?>
    cichity74 :master:

  2. #2
    come posso risolvere in mysql ???
    ========================
    Dovrei creare un campo "virtuale" ovvero un campo non presente in tabella ma che rappresenta il risultato di un calcolo tra due campi o un campo ed un valore in modo da poterlo richiamare,
    ho un campo di tipo datetime di none scadenza
    vorrei tramite DATE_ADD sottrarre al valore scadenza la data attuale
    in modo da ottenere il campo "virtuale" scade_tra
    up

  3. #3
    Puoi risolvere sia in mysql che in php.

    Pero' la differenza non potra' essere una data ma una serie di valori (n. giorni, n.ore ecc.) In pratica in entrambi i casi (php mysql) devi ottenere la differenza in secondi e poi ricalcolare.

    in php esiste il problema dei numeri dei mesi e dei giorni ad una cifra relativi a 8 e 9. In pratica non puoi mettere 08 09 perche' per definizione i numeri inizianti per 0 sono in notazione ottale. Quindi 08 09 darebbero un errore di calcolo. Bisogna mettere la data senza gli zeri davanti.

    Ti metto 2 righe in php che puoi facilmente trasformare in funzione.
    Codice PHP:
    $data_1 '2005-9-25 15:37:00';
    $data_2 '2005-9-30 10:11:00';

    list(
    $data1,$orario1) = explode(' ',$data_1);
    list(
    $anno1,$mese1,$giorno1) = explode('-',$data1);
    list(
    $ora1,$min1,$sec1) = explode(':',$orario1);

    list(
    $data2,$orario2) = explode(' ',$data_2);
    list(
    $anno2,$mese2,$giorno2) = explode('-',$data2);
    list(
    $ora2,$min2,$sec2) = explode(':',$orario2);

    $diff=mktime($ora2$min2,$sec2$mese2,$giorno2,$anno2) - mktime($ora1,$min1,$sec1$mese1,$giorno1,$anno1);

    $giorni floor($diff / (60*60*24));
    $diff1  floor($diff % (60*60*24));
    $ore    floor($diff1 / (60*60)) ;
    $diff2  floor($diff1 % (60*60)) ;
    $min    floor($diff2 / (60)) ;
    $sec    $diff2 60;

    echo 
    "$giorno1-$mese1-$anno1 $ora1:$min1:$sec1
    "
    ;
    echo 
    "$giorno2-$mese2-$anno2 $ora2:$min2:$sec2
    "
    ;

    echo 
    "
    N. giorni 
    $giorni $ore:$min:$sec
    "

    e' facilmente comprensibile. Se hai bisogno di chiarimenti son qua.
    Per mysql avrei bisogno di sapere quale "misura" ti serve... giorni oppure ore perche' cambia parecchio la query.


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

  4. #4
    Ti ringrazio per la disponibilità
    vorrei risolvere (se riesco) direttamente in mysql in quanto trovo inutile calcolare tramite una funzione php un valore che può restituirmi direttamente mysql

    la quary sottostante mi restituisce null
    ti premetto che i valori contenuti nel campo data_consegna sono maggiori della data attuale.
    Es:
    2004-08-25 18:41:03
    2004-08-26 13:15:00
    2004-08-27 16:00:00
    2004-08-28 03:37:00

    $query = "SELECT DATE_ADD( `data_consegna`, INTERVAL NOW() DAY_SECOND ) AS `scade_tra` FROM `ordini` ";

  5. #5
    La query presenta una serie di errori formali e rende data nulla.

    La differenza tra due date non e' un'altra data. Mi spiego?

    2004-08-25 18:41:03 - 2004-08-20 12:00:00 quale data dovrebbe essere?

    Ci sara' una differenza che devi esprimere in valori di giorni/ore/minuti . Per fare questo devi portare le due date in secondi e poi sottrarle. La funzione che usi poi tratta solo DAY_SECOND mentre tu passi una data completa.

    Facciamo un esempio:

    SELECT TIME_TO _SEC(NOW()) - TIME_TO _SEC(data1) AS diff FROM ecc...

    In diff avrai il numero dei secondi che intercorrono tra le due date. Ma il risultato sara' un timestamp non valido perche' fuori range. Sara' quindi un semplice numero di secondi, che dovrai gestire per esempio con la seconda parte dello script php che ti ho postato.
    codice:
    query... ecc.
    
    $diff = $res['diff'];
    
    $giorni = floor($diff / (60*60*24));
    $diff1  = floor($diff % (60*60*24));
    $ore    = floor($diff1 / (60*60)) ;
    $diff2  = floor($diff1 % (60*60)) ;
    $min    = floor($diff2 / (60)) ;
    $sec    = $diff2 % 60;
    
    echo "
    N. giorni $giorni $ore:$min:$sec
    ";

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

  6. #6
    eseguendo questa quary:
    SELECT TIME_TO _SEC( NOW( ) ) - TIME_TO _SEC( data_consegna ) AS diff FROM ordini

    direttamente in PhpMyAdmin mi da il seguente errore:

    Messaggio di MySQL:


    #1064 - Errore di sintassi nella query SQL vicino a '( NOW( ) ) - TIME_TO _SEC( data_consegna ) AS diff
    FROM ordini LIMIT 0, 30' linea 1

    :master:

  7. #7
    codice:
    SELECT TIME_TO _SEC( NOW( ) ) - TIME_TO _SEC( data_consegna ) AS diff FROM ordini
    Ho copiato e incollato.... hai degli spazi nel nome della funzione....

    TIME_TO _SEC <---- errato
    TIME_TO_SEC <---- corretto

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

  8. #8
    Grazie e scusami per la fagianata

    ciao
    cichity74

  9. #9
    Originariamente inviato da cichity74
    Grazie e scusami per la fagianata

    ciao
    cichity74
    Capita.... Volevo aggiungere che tu chiedi di calcolare il tempo intercorso tra due date e di questo abbiamo parlato. Ma se lo scopo e' quello di trovare dei record dove la data supera un certo range, per esempio di scadenza, la query sarebbe di molto semplificata.


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

  10. #10
    è corretto rigirare la frittata evitando la conversione in php
    tipo:
    SELECT SEC_TO_TIME(TIME_TO_SEC(NOW()) - TIME_TO_SEC(data_consegna)) AS diff FROM ordini

    :master:

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.