2011-08-24 17 views
5

Ho un database usando unix time per le sue date (sto usando mySQL). Voglio recuperare le date nel formato data giornaliero. Questa è la mia domanda:Come convertire il tempo UNIX prima del 1970 in formato data in MySQL?

SELECT FROM_UNIXTIME(time_created) FROM member 

Questo funziona bene con date dopo il 1970 (ad esempio, 1.314.162,229 mila), ma non funziona per le date prima del 1970 (ad esempio, -769.338.000). C'è qualche lavoro qui intorno?

risposta

9

Una possibile soluzione sarebbe quella di avere una costante a portata di mano corrispondente ai secondi in un certo numero di anni (preferibilmente un multiplo di 4). È possibile aggiungere questa costante, tradurre il tempo e quindi sottrarre il numero di anni scelti.

Esempio: scegliere 40 anni.

determinare la costante:

MySQL [files]> select adddate(from_unixtime(0), interval 40 year); 
+---------------------------------------------+ 
| adddate(from_unixtime(0), interval 40 year) | 
+---------------------------------------------+ 
| 2010-01-01 01:00:00       | 
+---------------------------------------------+ 
1 row in set (0.09 sec) 

MySQL [files]> select unix_timestamp(adddate(from_unixtime(0), interval 40 year)); 
+-------------------------------------------------------------+ 
| unix_timestamp(adddate(from_unixtime(0), interval 40 year)) | 
+-------------------------------------------------------------+ 
|             1262304000 | 
+-------------------------------------------------------------+ 
1 row in set (0.09 sec) 

Ora è possibile ogni unix timestamp x tra il 1930 e 20xx e usarlo.

select subdate(from_unixtime(x+1262304000), interval 40 year); 

Con il vostro esempio -769338000, si ottiene

MySQL [files]> select subdate(from_unixtime(-769338000+1262304000), interval 40 year); 
+-----------------------------------------------------------------+ 
| subdate(from_unixtime(-769338000+1262304000), interval 40 year) | 
+-----------------------------------------------------------------+ 
| 1945-08-15 17:00:00            | 
+-----------------------------------------------------------------+ 
1 row in set (0.09 sec) 
+0

Usando questo, grazie :) –

-3

A mia conoscenza non v'è cosa come il tempo UNIX prima di 1/1/1970 00:00 UTC. Altro a Wikipedia.

+0

significa non dovrei usare il tempo UNIX se ho intenzione di memorizzare le date di età superiore ai 1970 (come i compleanni)? –

+2

Certo che c'è. Dal tuo stesso link: "Questo può essere esteso all'indietro anche dall'epoca, usando numeri negativi; quindi 1957-10-04T00: 00: 00Z, 4 472 giorni prima dell'epoca, è rappresentato dal numero di tempo Unix -4 472 × 86 400 = -386 380 800. – Jacob

+0

@cularis: Ho perso quella parte e, per essere sinceramente, non l'ho mai visto usato così. L'unica volta in cui io, personalmente, avevo bisogno di fare qualsiasi cosa con date storiche, avevo cose che risalivano al 1200, quindi il tempo UNIX non è mai venuto fuori. Ho notato che un articolo di pari livello a quello che ho collegato dice ["Alcuni sistemi gestiscono correttamente valori di tempo negativi, mentre altri no."] (Http://en.wikipedia.org/wiki/Time_t). Immagino sia quello a cui stavo pensando. –

0
SELECT DATE_ADD(CAST('1970-01-01 00:00:00' AS DATETIME), INTERVAL `time_created` SECOND) FROM `member` 
2

Ho trovato un nuovo modo:

conversione ad oggi MySQL:

SELECT DATE_ADD(FROM_UNIXTIME(0), interval YOURTIMESTAMPHERE second); 

convertire il vostro epoca in una stringa data:

SELECT DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval YOURTIMESTAMPHERE second), '%Y-%m-%d'); 

E torna

SELECT TIMESTAMPDIFF(second,FROM_UNIXTIME(0),'1960-01-01 00:00:00'); 

fonte: http://www.epochconverter.com/programming/mysql-from-unixtime.php#negavtiveEpoch

Problemi correlati