2010-08-22 24 views
5

Ho pensato che sarebbe stata una cosa molto semplice, ma ho difficoltà a trovare risposte!sottrarre data e ora

Ho una tabella di supporto, con campi added_on e closed_on che traccia quando sono stati aperti e chiusi i ticket di supporto.

Mi piacerebbe eseguire una query che (closed_on - added_on) per mostrare la durata di un ticket è stato aperto. Entrambi i campi sono nel formato timestamp. Questo non è così semplice come pensavo sarebbe ...

Idealmente, l'output finale sarebbe X days Y hours Z minutes ma sarei felice solo di ottenere secondi totali o qualcosa del genere, posso certamente portarlo da lì.

dati

Esempio:

[id] [added_on]    [closed_on] 
1 2010-01-01 00:10:20 2010-01-02 00:10:20 
1 2010-01-03 00:00:01 2010-01-03 13:30:01 

risposta

3

Uso:

SELECT CONCAT(DATEDIFF(closed_on, added_on), 
       ' days ', 
       SUBSTRING_INDEX(TIMEDIFF(closed_on, added_on), ':', 1), 
       ' hours ', 
       SUBSTR(TIMEDIFF(closed_on, added_on), INSTR(TIMEDIFF(closed_on, added_on), ':')+1, 2), 
       ' minutes') 

con i tuoi dati di esempio, che mi dà:

0 days 00 hours 00 minutes 
0 days 13 hours 30 minutes 
0

È possibile utilizzare TIMESTAMPDIFF per ottenere la differenza in secondi:

SELECT TIMESTAMPDIFF(SECOND,closed_on,added_on)...

Edit: Un altro modo sarebbe quello di utilizzare UNIX_TIMESTAMP:

SELECT UNIX_TIMESTAMP(closed_on)-UNIX_TIMESTAMP(added_on)...