Guardar la marca de tiempo en la tabla mysql usando php

94

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

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

Aquí está mi INSERTdeclaració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')
Gautamlakum
fuente
1
¿De qué marca de tiempo estás hablando? ¿Dónde lo obtuviste?
Tu sentido común
1
¿Puedes pegar la estructura de tu tabla aquí?

Respuestas:

160

pasar así

date('Y-m-d H:i:s','1299762201428')
Jimy
fuente
7
pero el valor que obtiene en db muestra que el tipo de columna es datetime, si desea cambiarlo, timestampcambie el tipo de columna avarchar(15)
jimy
2
Luego colóquelo en un campo INT. De todos modos, una marca de tiempo es solo una representación de una fecha y viceversa. Puede convertir de marca de tiempo a fecha con la función que le dijo jimy, y al revés 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)
Carlos Campderrós
4
entonces, ¿cuál es el uso del tipo de datos de marca de tiempo? El campo s_time tiene un tipo de datos de marca de tiempo. ¿No puedo guardar 1299762201428 en ese campo?
Gautamlakum
@ lakum4stackof: para el tipo de datos de marca de tiempo, consulte dev.mysql.com/doc/refman/5.0/en/timestamp.html para obtener más detalles.
RollingBoy
1
@ lakum4stackof: el uso de la marca de tiempo es que guarde la marca de tiempo, pero solo se muestra como una fecha. Internamente (como todos los tipos de datos) se almacena como entero con signo. Si también desea formatear esa marca de tiempo como un número entero, le sugiero que use el campo INT en ese momento. El uso de la columna de marca de tiempo es la manipulación de la fecha (agregando intervalos y demás).
Michael JV
51

Hola, usa la FROM_UNIXTIME()función para esto.

Me gusta esto:

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')
Richard Tuin
fuente
¿Por qué es esto mejor que date('Y-m-d H:i:s','1299762201428')?
Yuri
5
Seguridad de tipos: FROM_UNIXTIMEproduce un tipo de fecha de mysql nativo mientras que php date()devuelve una cadena.
Richard Tuin
5
Es mejor porque el servidor web (PHP) y MySQL pueden estar en lugares diferentes. Entonces, date ('Ymd H: i: s', '1299762201428') establecerá la zona horaria del servidor web. Con diferentes servidores web ubicados en diferentes zonas, tendrá datos inconsistentes. Alternativamente, en su código, debe forzar la zona horaria de la aplicación a la zona horaria de MySQL. date_timezone_set
Ostico
18
$created_date = date("Y-m-d H:i:s");
$sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')";
$result = mysql_query($sql);
Tushar Kumar Kundan
fuente
15

Algunas cosas para aclarar:

  • El tipo de campo de marca de tiempo de MySQL no almacena marcas de tiempo de Unix sino un valor de tipo de fecha y hora.
  • La marca de tiempo de UNIX es un número de tipo int regular.
  • La marca de tiempo de la que está hablando no es una marca de tiempo 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));
Tu sentido común
fuente
3

El tipo de datos ' bigint unsigned ' puede adaptarse a este requisito.

RollingBoy
fuente
2

Supongo que el campo en el que está tratando de guardar el valor es un campo de fecha y hora que no lo 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. Para guardar la marca de tiempo, tendrá que convertir el campo a numérico usando una consulta como

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

Si está usando la hora actual, puede usar now () o current_timestamp.

Belinda
fuente
2

También puede utilizar now()en su consulta, es decir:

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

Utilizará la marca de tiempo actual.

Masood Moshref
fuente
1

Utilice FROM_UNIXTIME().

Nota: 1299762201428 se parece más a una marca de tiempo de milisegundos (como Date () * 1 en JavaScript), y probablemente tenga que dividir eso por 1000.

Udo G
fuente
1

Verifique el tipo de campo en la tabla, simplemente guarde el valor de la marca de tiempo en el tipo de datos como, bigintetc.

No datetimeescriba


fuente
1

Esto debería hacerlo:

  $time = new DateTime; 
misaizdaleka
fuente
0

Si la marca de tiempo es la hora actual, puede usar la NOW()función mysql

ipsum
fuente
0

Utilice el datetimetipo de campo. Viene con muchas ventajas como la legibilidad humana (nadie lee las marcas de tiempo) y las funciones de MySQL .

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

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

Znarkus
fuente
El timestamp tipo de campo también es legible por humanos (cuando se usa SELECTen la consola). Son muy diferentes y ambos tienen sus desventajas. La principal diferencia es cómo se manejan las zonas horarias.
Udo G
@Udo G: Tienes razón, pero sigo prefiriendo datetimepor varias razones. ¿Cuál es la mayor desventaja en su opinión?
Znarkus
La mayor ventaja para timestamp: coincide mejor con las marcas de tiempo de PHP, ya que es inmune a la configuración de la zona horaria tanto del servidor como del cliente, mientras que datetimecambia el valor que se muestra según la zona horaria de su cliente MySQL (por supuesto, depende de su proyecto, que uno es mejor). mayor desventaja para timestamp: no admite valores NULL y (no sé qué fumaron cuando programaron esto) un TIMESTAMP NOT NULLcampo se convierte en un TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. En mi caso, desafortunadamente necesito usarlo TIMESTAMPpor razones de TZ.
Udo G
0

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

Gautamlakum
fuente
3
Guardar un número en forma de cadena no suele ser una buena práctica, ya que las cadenas son más lentas en comparación y más difíciles de realizar.
RollingBoy
Mi voto va a unsigned int, pero vayamos por la madriguera del conejo. ¿Por qué varchar y no char? Es una entrada de longitud fija: microoptimización, pero aún así ...
BradChesney79
0

Que puede hacer: $date = \gmdate(\DATE_ISO8601);.

HelpNeeder
fuente
-1

Si sé que la base de datos es MySQL, usaré la función NOW () así:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 
Jannie Theunissen
fuente
Esto almacenaría solo la marca de tiempo actual, no estrictamente lo que solicita OP.
charliefortune