2011-08-24 22 views
5

Tengo una base de datos que usa tiempo Unix para sus fechas (estoy usando mySQL). Quiero recuperar las fechas en formato de fecha diaria. Esta es mi consulta:¿Cómo convertir el tiempo de UNIX antes del formato de 1970 a la fecha en MySQL?

SELECT FROM_UNIXTIME(time_created) FROM member 

Esto funciona bien con las fechas a partir de 1970 (por ejemplo, 1314162229), pero no funciona para fechas anteriores al 1970 (por ejemplo, -769 338 000). ¿Hay algún trabajo por aquí?

Respuesta

9

Una posible solución sería tener una aplicación constante que corresponda a los segundos en un cierto número de años (preferiblemente un múltiplo de 4). Puede agregar esta constante, traducir el tiempo y luego restar el número de años elegidos.

Ejemplo: elija 40 años.

determinar la constante:

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) 

Ahora que pueda cada marca de tiempo Unix x entre 1930 y 20xx y utilizarlo.

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

Con tu ejemplo -769338000, se obtiene

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

uso de este, gracias :) –

-3

Que yo sepa no es hay tal cosa como el tiempo UNIX antes del 1/1/1970 00:00 GMT. Más al Wikipedia.

+0

¿Quiere decir que no debería utilizar el tiempo UNIX Si voy a almacenar fechas anteriores a 1970 (como cumpleaños)? –

+2

Seguro que hay. Desde su propio enlace: 'Esto también puede extenderse hacia atrás desde la época, usando números negativos; así 1957-10-04T00: 00: 00Z, 4 472 días antes de la época, está representado por el número de tiempo de Unix -4 472 × 86 400 = -386 380 800. – Jacob

+0

@cularis: me perdí esa parte y, para ser franco, nunca lo he visto usado así. La única vez que yo, personalmente, tuve que hacer algo con fechas históricas, tenía cosas que se remontaban a los 1200, por lo que nunca llegó la hora de UNIX. Observé que un artículo relacionado con hermanos al que he vinculado dice ["Algunos sistemas manejan correctamente los valores de tiempo negativos, mientras que otros no"] (http://en.wikipedia.org/wiki/Time_t). Supongo que eso es en lo que estaba pensando. –

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

He encontrado una nueva forma:

convertir a la fecha de MySQL:

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

la conversión de su época a una cadena de fecha:

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

Y de vuelta

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

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

Cuestiones relacionadas