Datetime vs Timestamp en MySQL y PHP en la práctica?

24

No estoy seguro de cómo especificar mi tipo de datos como fecha y hora o marca de tiempo, creo que los necesitaré a ambos, pero en los diferentes eventos. Mi sitio web vende productos y servicios en todo el mundo y también tengo un sistema de cuentas para que el usuario inicie sesión. Por favor aclare lo siguiente:

  • Fecha y hora actual en que el cliente compra productos desde mi sitio web: ¿Fecha y hora?
  • Fecha y hora de entrega según su ubicación y fecha / hora de compra, calculadas a partir de nuestro sistema: ¿Fecha y hora?
  • Última vez que iniciaron sesión en su cuenta: ¿Marca de tiempo?

    1. ¿Cuál es el código en php para almacenar la fecha de compra (fecha actual) y luego almacenar en la base de datos?
    2. Elabore cómo usar cada uno de ellos, ya que después de leer muchas explicaciones en Internet, todavía no lo entiendo.
Modular
fuente
Hace un tiempo tuve un gran proyecto donde el rendimiento era una necesidad absoluta, después de meses de investigación terminamos con una marca de tiempo UTC almacenada en un campo varchar, resultó ser más rápido y mejor para nuestras necesidades (gran red social)
JasonDavis

Respuestas:

29

Marcas de tiempo de MySQL :

  • Se almacenan en UTC

    Se convierten a UTC en el almacenamiento y se vuelven a convertir a su zona horaria en la recuperación. Si cambia la configuración de la zona horaria , los valores recuperados también cambian.

  • Se puede inicializar y actualizar automáticamente

    Puede establecer su valor predeterminado y / o el valor de actualización automática en CURRENT_TIMESTAMP

  • Tener un rango de 1970-01-01 00:00:01 UTCa2038-01-19 03:14:07 UTC

Mientras que MySQL datetime :

  • Lo que almacenas es lo que obtienes ™.

  • Tener un rango de 1000-01-01 00:00:00a9999-12-31 23:59:59

    Los valores fuera del rango pueden funcionar, pero solo los valores dentro del rango están garantizados para funcionar.

  • Puede almacenar fechas donde día o mes es cero.

    ¡Esta es la forma MySQL de almacenar cumpleaños! No puede hacer eso con a TIMESTAMP, con la única excepción de que es el valor cero de 0000-00-00.

  • Puede almacenar fechas no válidas, si las necesita, en modo ALLOW_INVALID_DATES .

  • Puede establecer el valor predeterminado NOW()en algunos casos, pero la forma preferible y más natural de inicializar y actualizar automáticamente las fechas es TIMESTAMP.

Y, por supuesto, también hay DATEy TIME, que funcionan igual DATETIME, pero, por supuesto, DATEno le importa el tiempo TIMEni la fecha. Los cuatro tipos de datos funcionan perfectamente con la amplia gama de funciones de fecha y hora , pero cuando mezcle tipos de datos, debe tener en cuenta los efectos de conversión .

Ahora, a su pregunta: debe usar en DATETIMEtodas partes. No por razones técnicas, pero dado que aún no está claro cómo funciona MySQL, DATETIMEes la opción más simple. Esto significará que tendrá que calcular la marca de tiempo actual en PHP antes de almacenarlo, eso es tan fácil como:

$mysqldate = date("Y-m-d H:i:s"); 

La función de fecha de PHP funciona como:

string date ( string $format [, int $timestamp = time() ] )

El "Y-m-d H:i:s"formato es el compatible con MySQL y al dejar el segundo parámetro vacío, se date()llama time()para obtener la marca de tiempo UNIX actual .

El uso de a en TIMESTAMPlugar de a DATETIMEtiene el valor agregado de MySQL asumiendo la responsabilidad de decidir sobre la marca de tiempo actual, y puede omitir el campo cuando está insertando / actualizando. Pero como ya está enviando una consulta, y el código para obtener la marca de tiempo actual en PHP es mínimo, puede utilizarlo con seguridad DATETIMEpara todo.

En cuanto al código real para almacenar la marca de tiempo de PHP en la base de datos, debe mirar Objetos de datos de PHP , y si aún no está claro, pregunte por StackOverflow . Pero ya hay casi 1.5k preguntas relacionadas , asegúrese de revisarlas antes de preguntar. Solo una pista, las declaraciones preparadas es cómo lo hacen los niños geniales.

Yannis
fuente
Hmm, eso podría ser un problema sobre cómo enviar la consulta a MySQL, o en la estructura de su tabla ... StackOverflow es un mejor lugar para este tipo de problemas, publique una pregunta allí con la estructura de su tabla y su código php completo, y algunos detalles sobre cuál es el problema y lo que ya has probado. Realmente no discutimos los detalles de implementación aquí ...
yannis
Gracias por su respuesta. He intentado usar $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO table VALUE ('". $ mysqldate."') en mi código php pero se mantendría en MySQL como 0000-00-00 00:00:00 en Fecha (campo) - Fecha y hora (tipo de datos). Tengo la intención de almacenar la fecha y hora actual. Si configuro el tipo de datos como Marca de tiempo en la base de datos, ¿cómo codificar en php?
Modular
No tengo permitido publicar ningún comentario en Stackoverflow en este momento. Suena un poco vergonzoso, pero así me lo hicieron.
Modular
Lo siento, pero si estás en modo de suspensión temporal debe haber una buena razón. Ahora, un posible error en el código en su comentario es que está nombrando el campo como Date, esa es una palabra reservada para el DATEtipo de datos y pueden suceder cosas extrañas (dependiendo de la versión de MySQL), así que intente cambiar el nombre a algo como creationdatey vea qué sucede . Además, desde PHP debe tratar los TIMESTAMPcampos de la misma manera que los DATETIMEcampos, en realidad no importa. Su formato es el mismo.
yannis
Un millón de gracias. Se ha resuelto ahora después de pasar casi toda la noche tratando de averiguar por qué. :)
Modular
2

Referencia tomada de este artículo:

Las principales diferencias:

TIMESTAMP se utiliza para realizar un seguimiento de los cambios en los registros y actualizar cada vez que se modifica el registro. DATETIME se usa para almacenar valores específicos y estáticos que no se ven afectados por ningún cambio en los registros.

TIMESTAMP también se ve afectado por diferentes ajustes relacionados con la ZONA HORA. DATETIME es constante.

TIMESTAMP convirtió internamente la zona horaria actual a UTC para el almacenamiento, y durante la recuperación se convirtió de nuevo a la zona horaria actual. DATETIME no puede hacer esto.

Rango admitido TIMESTAMP: '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC DATETIME rango admitido: '1000-01-01 00:00:00' a '9999 -12-31 23:59:59 ′

Anvesh
fuente
1
Entonces, en el año 2040, ¿qué usarías para los cambios en los registros, Timestamp? Supongo que no.
Bsienn
-1

Bueno, veo esto de una manera muy simple. En su caso, usaría ambos datetimey timestamp. Con el uso de ambos, no tendrá ningún problema adicional con el almacenamiento de datos o algo así. Un campo adicional (columna) en su tabla tampoco es un gran problema.

Entonces, en mi punto de vista y experiencias hasta ahora, usualmente uso ambos. Cuando desee mostrar una fecha a su visitante o hacerla comprensible para los visitantes, muestre una fecha en formato de fecha y hora.

El formato de fecha y hora puede ser una molestia cuando desea calcular algo (diferencia entre 2 fechas, obtener la fecha de ayer de la fecha actual, obtener hace 1 semana desde la fecha actual, obtener la fecha de mañana o algo así). No es realmente difícil, pero generalmente lo hará necesita convertirlos timestampy luego hacer las cosas. Y sí, fecha y hora actual, por ejemplo, con la que obtienes: $current = date("Y-m-d");o $current = date("Y-m-d H:i:s");si también quieres horas, minutos y segundos.

La marca de tiempo es solo un número de 11 dígitos que realmente no "significa" nada. Cuando lo mire, no sabrá qué fecha representa. Por lo tanto, no es realmente fácil de usar y no puede usarlo para hacer eco y mostrarlo a sus visitantes, por ejemplo. Deberá "transformarlo" en algo legible. Pero también le ofrece la posibilidad de convertirlo fácilmente y calcular diferentes fechas. Por ejemplo, si desea obtener la marca de tiempo de mañana a la misma hora, simplemente agregue el número de segundos a la fecha actual y tenga la marca de tiempo de mañana. Ejemplo: $tomorrow = time()+24*3600;También puede obtener fácilmente una diferencia entre dos fechas en segundos o algo así.

Por lo tanto, sugeriría usar fecha y hora. Incluso si usa, por ejemplo, PhpMyadmin y desea ver rápidamente algunos datos, será más fácil para usted cuando vea una fecha en formato de fecha y hora (ejemplo 2011-12-20 10:15:20:) como lo será si solo mira el número de 11 dígitos. Así que usa ambos y luego llama y usa el que más te convenga.

Si debe o desea elegir solo uno, sugeriría una marca de tiempo; de lo contrario, use ambos.

marca
fuente
1
-1 Las Timestamp is just a number 11 digit long which doesn't really "mean" anythingmarcas de tiempo de MySQL se almacenan en el mismo formato que datetime. También necesita convertirlos a marcas de tiempo de php, para hacer los cálculos que describe, O simplemente use las muchas funciones de fecha / hora de MySQL y haga los cálculos en la base de datos. Tu respuesta realmente no tiene sentido.
yannis