Date e operazioni aritmetiche

Veronica Auretta

Nuovo Utente
21 Apr 2015
25
0
0
Salve, ho un problema... non riuscirò mai a capire come funziona la gestione delle date in php.

Ho una data che richiamo dal db, tipo "date"... che chiamerò
PHP:
$data['scadenza']
a questa data dovrei aggiungere un intervallo di tempo di 10 giorni e poi mostrare a video quanto manca alla scadenza dei 10 giorni.

Es: se la data del db è 05/11/2015, aggiungo 10 giorni... 15/11/2015 vorrei sapere alla data odierna quanti giorni mancano al 15/11... cioè oggi 9, domani 8 e così via. Com'è possibile farlo? Ho provato in molti modi, sbagliando, le date sono un msitero per me ):
 

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Puoi farlo direttamente quando estrai le date dal db..

Codice:
SELECT DATEDIFF('2014-11-30','2014-11-29')
Il risultato di questo select sarà 1

Al posto delle date puoi utilizzare una variabile php o anche
Codice:
SELECT DATEDIFF(CURDATE(),'2014-11-29')

Che sta per la data corrente

La stessa cosa funziona in questa situazione:
Codice:
SELECT DATEDIFF('2014-01-28 11:41:14', '2014-01-27')

Vedi anche questo articolo..

https://www.mrw.it/php/differenza-date-php-creiamo-funzione-datediff_7537.html
 
Ultima modifica:

Veronica Auretta

Nuovo Utente
21 Apr 2015
25
0
0
Grazie per la risposta celere, ho guardato anche la funzione che mi hai linkato e sembrano utili, però ho un problema, io devo aggiungere dieci giorni alla data che estraggo dal db ed è questo il mio problema principale. Potresti farmi un esempio pratico di come, estratta la data, posso aggiungere 10 giorni e poi fare la differenza tra la data corrente e questa? in modo che mi esca una sorta di conto alla rovescia...
 

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Prova quest astringa che ho costruito.. Vediamo se funziona.. non l'ho provata E' SPERIMENTALE uhauhaa.
Prova sta roba qui :p
PHP:
<?php
$sql = 'SELECT DATEDIFF(CURDATE(),(DATE_ADD((SELECT data_db FROM tabella), INTERVAL 10 DAY)))';

//il risultato dovrebbe essere la differenza tra la (data di oggi - (la data estratta +10 giorni ))
?>

ovviamente sostituisci data_db con la data da ricercare nel db e tabella con la rispettiva tabella, fammi sapere se funziona ovviamente.. Dopo tabella puoi aggiungere un WHERE così:

PHP:
<?php
$sql = 'SELECT DATEDIFF(CURDATE(),(DATE_ADD((SELECT data_db FROM tabella WHERE nomeutente = "giovani"), INTERVAL 10 DAY)))';

?>
Ovviamente anche qui al posto di WHERE nomeutente = "giovani" puoi mettere la condizione che più ti aggrada..
 
Ultima modifica:

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Allora ho fatto qualche test e modificato la differenza e funziona.. Io ho usato PDO, ovviamente l'ho confrontato con una data che avevo su un mio db:
PHP:
<?php
include 'connection.php';
$sql = 'SELECT DATEDIFF((DATE_ADD((SELECT data FROM blog WHERE data = "2015-09-17"), INTERVAL 10 DAY)),CURDATE()) AS count'; 
$result = $pdo->query($sql);
$test = $result->fetch( PDO::FETCH_ASSOC );
echo $test['count']; 

//il risultato nel mio caso è "-40" che sono i giorni passati da quando ho scritto l'articolo +10 con data = "2015-09-17", se avessi messo una data futura sarebbe apparso un numero positivo.. 
?>
 
Ultima modifica:

Veronica Auretta

Nuovo Utente
21 Apr 2015
25
0
0
Premetto che so cosa sia il PDO (ho letto qualcosa giusto adesso) e non l'ho mai utilizzato... questo è l'errore che riscontro

Fatal error: Call to a member function query() on a non-object in bla/bla/bla.php on line tot

Ovviamente è proprio la riga dove ho inserito il codice che hai postato sopra.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
senza fare tante interrogazioni al db e la scadenza ti serve solo per essere visualizzata a monitor
PHP:
<?php
function differenza($d){
	$ex=explode("/", $d);//$ex[0] gg, $ex[1] mm, $ex[2] anno
	//se separatore diversi da / esempio il punto
	//$ex=explode(".", $d);
	$scad=mktime(0,0,0,(int)$ex[1],(int)$ex[0],(int)$ex[2]);//trasformata in timestamp
	$attuale=time();//in timestamp
	return (int)(($scad-$attuale)/(24*60*60));//giorni
}
//estrazione dal db
$data['scadenza']="05/11/2015";//ipotesi data estratta
$scadenza=differenza($data['scadenza']);
if($scadenza >=0){
	echo "l'abbonamento scadrà tra $scadenza giorni";
}else{
	echo "l'abbonamento è scaduto da ". abs($scadenza)." giorni";
}
?>
output (oggi 06/11/2015)
l'abbonamento è scaduto da 1 giorni
 

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Come sempre grande borgo italia ;), in effetti avevo pensato al timestamp ma nn ero sicuro dell'output del db.. :p


Saluti.
G.G.
 

Veronica Auretta

Nuovo Utente
21 Apr 2015
25
0
0
Ho provato il codice e funziona, ho fatto solo una piccolissima modifica perché a me serviva avere il conto alla rovescia dei 10 giorni.

PHP:
$rimasti = 10+($scadenza);
if($rimasti>=0){	
    echo "l'abbonamento scadrà tra ".$rimasti." giorni";}

Così pare che vada! Grazie ad entrambi, però mi piacerebbe comunque sapere quell'altro metodo in che modo si potrebbe utilizzare, potrebbe tornare utile!
 
Ultima modifica:

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Io personalmente lo utilizzo per eliminare offerte scadute giornalmente. Ho settato dei cron job che ogni mattina provvedono ad eliminare, tramite una query simile, tutte le offerte più vecche di 7gg. In questo caso la selezione dal db è anche necessaria.


Saluti.
G.G.
 
Ultima modifica:

otto9due

Utente Attivo
22 Feb 2014
529
21
28
ciao
senza fare tante interrogazioni al db e la scadenza ti serve solo per essere visualizzata a monitor
PHP:
<?php
function differenza($d){
	$ex=explode("/", $d);//$ex[0] gg, $ex[1] mm, $ex[2] anno
	//se separatore diversi da / esempio il punto
	//$ex=explode(".", $d);
	$scad=mktime(0,0,0,(int)$ex[1],(int)$ex[0],(int)$ex[2]);//trasformata in timestamp
	$attuale=time();//in timestamp
	return (int)(($scad-$attuale)/(24*60*60));//giorni
}
//estrazione dal db
$data['scadenza']="05/11/2015";//ipotesi data estratta
$scadenza=differenza($data['scadenza']);
if($scadenza >=0){
	echo "l'abbonamento scadrà tra $scadenza giorni";
}else{
	echo "l'abbonamento è scaduto da ". abs($scadenza)." giorni";
}
?>
output (oggi 06/11/2015)
Stavo dando un'occhiata alla funzione, per cercare di imparare sempre qualcosa di nuovo :D
Notavo che nella trasformazione della data tramite mktime() hai utilizzato anche (int) prima della variabile. Per me era una cosa nuova, immaginavo che servisse a rendere intero qualcosa, e così per imparare qualcosa sono andato a cercarlo ed ecco il risultato:

PHP:
$var = '1a';

echo $var;               // 1a
echo (int) $var;     //1

In questo caso, essendo la data formata solo da numeri perchè l'hai usato? Piccola curiosità ;P
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
(int) serve a forzare ad intero una stringa di carattare, se la stringa inizia per un numero viene preso questo unmero
guarda i vari risultati
PHP:
<?php
$var = '1a';
echo $var;// 1a
echo (int)$var;//1
$var = 'aa';
echo $var;// 1a
echo (int)$var;//0 (false)
$var = 'a7';
echo $var;// a7
echo (int)$var;//0 (false)
$var = 12.355;//float
echo $var;// 12.355
echo (int)$var;//12
?>
la funzione mktime() richiede come parametri numeri interi, quindi per sicurezza se la data proviene da un input lo forzo ad intero, anche se andrebbero fatti dei controlli a monte, se al posto dell'echo tu avessi usato var_dump($var) avresti visto anche come il tipo si trasforma
 

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Qualora dovesse interessarti ho trovato anche quest'altra funzione.. Sembra molto efficace:

PHP:
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

Risultato: +272 days
 
Discussioni simili
Autore Titolo Forum Risposte Data
N operazioni con le date. PHP 2
MarcoGrazia Calcolo fra due date con esclusione delle feste PHP 7
S Differenza date record successivi MS Access 7
E Format Date PHP 37
napuleone Con le date il codice da di matto o forse non è così Javascript 6
napuleone Con le date mi da di matto o forse è proprio così jQuery 1
elpirata Impedire inserimento data di oggi e date passate jQuery 39
A attributo "min" per input gestione date PHP 8
Alex_70 Javascript date color Javascript 3
FabioJ Formattazione date openoffice calc Linux e Software 0
O query con date in formato stringa PHP 3
F Creare un set di date a seconda del frazionamento scelto da inserire in MySQL PHP 6
S aggiungere colonna date in una tabella già esistente Database 0
P [PHP] Input Type="date" non va correttamente con Apple PHP 2
A [Java]Date diminuite di un giorno su db MySQL Java 0
V [MySQL] problema query con date su server MySQL 5
maxnegri [PHP]Funzione di calcolo prezzo di una camera in un range di date PHP 62
maxnegri Conoscere giorni della settimana fra due date con php PHP 2
S [HTML] Problema <input type="date"> HTML e CSS 0
Daniele_Carrara [Javascript] Modifica input date Javascript 5
Licantropo [MySQL] Cambiare le date MySQL 4
P [PHP] Calcolo prezzi camera in range di date diverse PHP 11
M [PHP] Convertire date da americana a italiana direttamente nel db PHP 6
trattorino [PHP] prelevare minuti da date confrontate PHP 2
Emix [PHP] Differenza Date + Ore PHP 3
MarcoGrazia campo con autocompletamento a formato multiplo (nomi/date) jQuery 3
diego66 [Javascript] Calcolare giorni lavorativi comprese tra due date Javascript 0
napuleone [PHP] Ho la settimana e l'anno cerco le date PHP 4
gandalf1959 Selezionare un intervallo tra due date, php e mysql PHP 2
valvasori [PHP] Proble di date PHP 14
M [PHP] Date(time) PHP 2
filippino Chiavi a corrispondenza inversa per i risultati organici? (Era: come NON farsi trovare con date chia SEO e Posizionamento 4
S funzioni per calcoli sulle date PHP 4
G Tabella con date PHP 9
felino [MySQL][phpMyAdmin] Convertire colonna da VARCHAR a DATE MySQL 3
M Limit DATE PHP 6
A Problema con "explode" su campo date PHP 9
V date mysql MySQL 0
V Reperire le date della settimana del calendario jQuery 1
M Otttimizazione date calendario prenotazioni PHP 0
elpirata Query di ricerca su campo date MySQL 1
L Conversione date ed estrazione PHP 0
J Confronto Date PHP - MySQL PHP 1
M Problema con date importate da file txt PHP 13
C Comparazione date in italiano PHP 1
M BETWEEN tra due date MySQL 0
M Calcolo giorni lavorativi tra due date (escluse le feste comandate) PHP 6
S Problema conteggio intervallo date PHP 2
E calcolo date feriali Database 6
M date e periodicità PHP 1

Discussioni simili