2011-04-12 38 views
71

Tengo un campo en una tabla MySQL que tiene un tipo de datos timestamp. Estoy guardando datos en esa tabla. Pero cuando paso la marca de tiempo (1299762201428) al registro, guarda automáticamente el valor 0000-00-00 00:00:00 en esa tabla.Guardando timestamp en la tabla mysql usando php

¿Cómo puedo almacenar la marca de tiempo en una tabla MySQL?

Aquí es mi INSERT declaración:

INSERT INTO table_name (id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status) 
VALUES (1,5,9,'2',1299762201428,5,10,20,'1'), 
     (2,5,9,'2',1299762201428,5,10,20,'1') 
+1

** ** ¿Qué marca de tiempo que estás hablando? ¿Dónde lo obtuviste? –

+0

¿puedes pegar aquí la estructura de tu tabla? –

Respuesta

126

pase como esto

date('Y-m-d H:i:s','1299762201428') 
+7

no. Quiero guardar la marca de tiempo no fecha. – gautamlakum

+7

pero el valor que obtienes en db muestra que el tipo de columna es 'datetime', si quieres cambiarlo a' timestamp' luego cambia el tipo de columna a 'varchar (15)' – jimy

+2

Luego ponlo en un campo INT. De todos modos, una marca de tiempo es solo una representación de una fecha, y viceversa. Puede convertir desde la marca de tiempo a la fecha con la función que le dijo jimy, y viceversa con 'strtotime'. editar: por cierto, la marca de tiempo solo cubre un rango de todas las fechas posibles (1970-01-01 a xx-xx-2032 creo) –

-1

Si la indicación de la hora es la hora actual, se podría utilizar el mysql NOW() función

1

tipo de datos 'bigint sin signo 'puede satisfacer este requisito.

1

Supongo que el campo en el que está intentando guardar el valor es un campo de fecha y hora no es, pero lo mismo parece ser cierto para las marcas de tiempo. Si es así, mysql espera que el formato sea Año-mes-día Hora: minuto: segundo. Con el fin de salvar a la marca de tiempo que tendrá que convertir el campo en numérico usando una consulta como

alter table <table_name> change <field> <field> bigint unsigned 

Si está utilizando la hora actual se puede utilizar ahora() o current_timestamp.

43

Oye, utilice la función FROM_UNIXTIME() para esto.

De esta manera:

INSERT INTO table_name 
(id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status) 
VALUES 
(1,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1'), 
(2,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1') 
+0

¿Por qué es mejor que 'date ('Y-m-d H: i: s', '1299762201428')'? – Yuri

+4

Tipo de seguridad: 'FROM_UNIXTIME' produce un tipo de fecha mysql nativo, mientras que php' date() 'devuelve una cadena. –

+3

Es mejor porque el servidor web (PHP) y MySQL pueden estar en diferentes lugares. Entonces, la fecha ('Y-m-d H: i: s', '1299762201428') configurará el TimeZone del servidor web. Con diferentes servidores web ubicados en diferentes zonas, tendrá datos incoherentes. Alternativamente, en su código, debe forzar la zona horaria de la aplicación a la zona horaria de MySQL. [date_timezone_set] (http://php.net/manual/en/function.date-timezone-set.php) – Ostico

0

Uso FROM_UNIXTIME().

Nota: 1299762201428 parece más a un milisegundo-marca de tiempo (como Fecha() * 1 en JavaScript), y es probable que tenga que dividir por 1000.

-1

Uso datetime tipo de campo. Viene con muchas ventajas, como la legibilidad humana (nadie lee las marcas de tiempo) y MySQL functions.

Para convertir de una marca de tiempo unix, puede utilizar la función MySQL FROM_UNIXTIME(1299762201428). Para convertir de nuevo puede usar UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Por supuesto, si no te gusta la función de MySQL, siempre puedes usar PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).

+0

El tipo de campo 'timestamp' * * también es legible para humanos (cuando se usa' SELECT' en la consola). Son muy diferentes y ambos tienen sus desventajas. La principal diferencia es cómo se manejan las zonas horarias. –

+0

@Udo G: Tiene razón, pero todavía prefiero 'datetime' por varias razones. ¿Cuál es la mayor desventaja/ventaja en tu opinión? – Znarkus

+0

mayor ventaja para 'timestamp': es mejor que coincida con las marcas de tiempo de PHP ya que es inmune a las configuraciones de zona horaria tanto del servidor como del cliente, mientras' datetime' cambia * display * value dependiendo del huso horario de su cliente MySQL (por supuesto, depende de tu proyecto, cuál es mejor). mayor desventaja para 'timestamp': no admite valores NULL y (no sé lo que fumaron cuando programaron esto) un campo' TIMESTAMP NOT NULL' se convierte en 'TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP'.En mi caso, desafortunadamente * necesito * usar 'TIMESTAMP' por razones de TZ. –

0

Mejor es el tipo de datos de uso varchar(15).

+2

Guardar un número en forma de cadena generalmente no es una buena práctica, ya que las cadenas son más lentas en comparación y más difíciles de realizar. – RollingBoy

+0

Mi voto va a unsigned int-- pero bajemos por el agujero del conejo. ¿Por qué varchar y no char? Es una entrada de longitud fija, micro-optimización, pero aún ... – BradChesney79

0

Comprobar tipo de campo en la tabla simplemente guardar el valor de marca de tiempo en el tipo de datos como bigint etc.

No datetime tipo

12

Algunas cosas para aclarar:

  • MySQL tipo de campo de marca de tiempo no almacena marcas de tiempo Unix, sino más bien un valor tipo fecha y hora.
  • La marca de tiempo UNIX es una cantidad de un tipo int regular.
  • La marca de tiempo de la que está hablando no es una indicación de fecha y hora normal de Unix, sino una marca de tiempo con milisegundos.

por lo tanto, la respuesta correcta sería

$timestamp = '1299762201428'; 
$date = date('Y-m-d H:i:s', substr($timestamp, 0, -3)); 
0

Usted puede utilizar now(), así como en la consulta, es decir:

insert into table (time) values(now()); 

Utilizará la marca de tiempo actual.

15
$created_date = date("Y-m-d H:i:s"); 
$sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')"; 
$result = mysql_query($sql); 
-1

Si conozco a la base de datos es MySQL, voy a utilizar la función NOW() así:

INSERT INTO table_name 
    (id, name, created_at) 
VALUES 
    (1, 'Gordon', NOW()) 
+0

Esto almacenaría la marca de tiempo actual solamente, no estrictamente lo que OP está pidiendo. – charliefortune

Cuestiones relacionadas