dubbi su SYSDATE(), NOW() etc | Tips & Tricks

Topic: Pubblico - Composto da 7 Posts di 3 Utenti.

18 Marzo, 2011 14:24 #1
DebUsr
Utente

DebUsr
Registrato: Feb, 2011
Posts: 81
Offline

in riferimento al Tip:
http://www.mysqlitalia.it/tips/138-record-inseriti-meno-di-4-ore-prima

stavo facendo delle prove:

 1SELECT 
 2SYSDATE() AS `data_di_sistema`, 
 3(SYSDATE() - INTERVAL 1 HOUR) AS `ris.A`, 
 4(NOW() - INTERVAL 1 HOUR) AS `ris.B`, 
 5(DATE_SUB(SYSDATE(), INTERVAL 1 HOUR)) AS `ris.C`, 
 6(DATE_SUB(NOW(), INTERVAL 1 HOUR)) AS `ris.D`;
 7
 8/*
 9+---------------------+---------------------+---------------------+---------------------+---------------------+
10| data_di_sistema     | ris.A               | ris.B               | ris.C               | ris.D               |
11+---------------------+---------------------+---------------------+---------------------+---------------------+
12| 2011-03-18 15:27:00 | 2011-03-18 14:27:00 | 2011-03-18 14:27:00 | 2011-03-18 14:27:00 | 2011-03-18 14:27:00 |
13+---------------------+---------------------+---------------------+---------------------+---------------------+

mi chiedevo quale è la forma / sintassi migliore?

Ciao
DebUsr

Ultima modifica 18 Marzo, 2011 14:27 di DebUsr

18 Marzo, 2011 14:48 #2
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Un'operazione semplice come questa non presenterà differenze di performance minimamente significative qualunque scelta tu faccia.

In questo caso, visto che si tratta di un valore scalare, puoi utilizzare la funzione benchmark, eseguire ciascuna sottrazione 1 milione o 10 milioni di volte e vedere i risultati.

L'unica cosa davvero interessante è la sottile differenza che esiste tra le funzioni sysdate() e now(). Supponi di avere una stored procedure che esegua inserimenti massivi in una tabella tramite un'unica insert multiriga.
Nel caso tu abbia due campi di tipo datetime che popolerai rispettivamente con le due suddette funzioni, con la funzione now() otterrai per tutti i record lo stesso orario (quello in cui avviene la prima insert), mentre con sysdate() l'orario sarà esattamente quello in cui avviene l'inserimento visto che una sp può richiedere parecchio tempo.

Come si dice, un esempio vale più di mille parole:

 1mysql> SELECT NOW(), SLEEP(2), NOW();
 2+---------------------+----------+---------------------+
 3| NOW()               | SLEEP(2) | NOW()               |
 4+---------------------+----------+---------------------+
 5| 2011-03-18 15:47:08 |        0 | 2011-03-18 15:47:08 |
 6+---------------------+----------+---------------------+
 71 row in set (2.00 sec)
 8
 9mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
10+---------------------+----------+---------------------+
11| SYSDATE()           | SLEEP(2) | SYSDATE()           |
12+---------------------+----------+---------------------+
13| 2011-03-18 15:47:23 |        0 | 2011-03-18 15:47:25 |
14+---------------------+----------+---------------------+

Ciao.

Ultima modifica 18 Marzo, 2011 15:21 di john_revelator


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

18 Marzo, 2011 15:00 #3
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

Interessante :)


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

18 Marzo, 2011 15:07 #4
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Eh sì, a uno sguardo superficiale le due funzioni sembrano identiche e non se ne capisce l'utilità. Ciao collega :)


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

18 Marzo, 2011 15:19 #5
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

Questa del sysdate e now è stata una cosa che mi ha sempre incuriosito ma non ho mai pensato di chiedere o documentarmi in giro :)

Ho fatto un benchmark e sembra che il (DATE_SUB(NOW(), INTERVAL 1 HOUR)) sia leggermente più veloce rispetto al (NOW() - INTERVAL 1 HOUR), immagino che la 'sottrazione' implicita richieda a MySQL un passaggio in più rispetto a quella esplicita. In ogni caso, sempre in benckmark, il NOW() sembra molto più veloce del SYSDATE() e vista la differenza dei due comandi si capisce anche perchè :)

Grande revelator :D


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

18 Marzo, 2011 15:24 #6
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Ah, davvero. ?
Io uso sempre la forma now() - interval X hour perchè son pigro. Vedrò allora di cambiare abitudini. Grazie per il feedback. ;)


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

18 Marzo, 2011 16:45 #7
DebUsr
Utente

DebUsr
Registrato: Feb, 2011
Posts: 81
Offline

grazie a tutti per l'approfondimento :)

Condividi su:

Loggati o Registrati per replicare