2013-10-25 9 views
7

Ho una domanda che prende l'ultima data di aggiornamento (timestamp ma come bigint colonna (20)) in questo modo:Convertire BigInt timestamp in una data reale con l'aggregazione e operazioni riga mySQL

SELECT a.id_workorder, MAX(b.update_date) AS udpate_date 
FROM main_log a, 
(
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_a 
    GROUP BY log_id 
    UNION 
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_b 
    GROUP BY log_id 
)b 
WHERE a.id_log = b.log_id 
GROUP BY b.log_id 

e restituisce l'ultima data di aggiornamento (unix timestamp come un bigint (20)) per ogni tipo di log (a o B):

id   last update 
------------------------- 
1001  1376750476349 
1002  1376753690861 
1003  1378122801986 
1004  1377764414858 
1005  1377847226096 
... 

Ora voglio formattare il ritorno nel formato della data e io ingenuamente se posso solo formattare il timestamp esterno con FROM_UNIXTIME in questo modo:

SELECT 
    a.id_workorder, 
    FROM_UNIXTIME(MAX(b.update_date)) AS udpate_date 
FROM main_log a, 
(
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_a 
    GROUP BY log_id 
    UNION 
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_b 
    GROUP BY log_id 
)b 
WHERE a.id_log = b.log_id 
GROUP BY b.log_id 

ma dà

id   last update 
------------------------- 
1001  null 
1002  null 
1003  null 
1004  null 
1005  null 
... 

Ho provato a mettere la conversione nelle query interne pure ma è lo stesso.

Ho anche provato a trovare risposte su SO, documentazione mySQL e Google ma non ho trovato il motivo per cui la conversione non funziona quando faccio un group by.

risposta

19

tuo timestamp è espresso in millisecondi provare:

SELECT a.id_workorder, 
FROM_UNIXTIME(MAX(b.update_date/1000)) AS udpate_date 
FROM main_log a, ... 

(cioè dividere il tempo per 1000 per ottenere secondi)

mysql> select FROM_UNIXTIME(1376750476349); 
+------------------------------+ 
| FROM_UNIXTIME(1376750476349) | 
+------------------------------+ 
| NULL       | 
+------------------------------+ 
1 row in set (0.06 sec) 

mysql> select FROM_UNIXTIME(1376750476349/1000); 
+-----------------------------------+ 
| FROM_UNIXTIME(1376750476349/1000) | 
+-----------------------------------+ 
| 2013-08-17 15:41:16    | 
+-----------------------------------+ 
1 row in set (0.02 sec) 

mysql> 
+0

Wow, quanto fosse stupido ... grazie mille per notare il millisecondi (anche io dubito che abbiano davvero bisogno di precisione millisecondo nel loro sistema). Comunque funziona bene dividendo per 1000. –

+0

grazie anche, la seconda volta sono stato sorpreso dai millisecondi ... –

Problemi correlati