Ver Mensaje Individual
  #4 (permalink)  
Antiguo 07/02/2012, 09:52
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: MySQL formato de fecha timestamp por defecto

Hola radge:

Vamos aclarando una cosa: las fechas, en cualquier motor de BD SIEMPRE SE ALMACENAN EN FORMATO ANSI (yyyy-mm-dd hh:mi:ss), ya que este es el formato estándar...

Es recomendable que para el manejo de fecha también utilices el formato ANSI y sólo cuando necesites presentar la información le des el formato que quieras a las fechas.

MySQL proporciona muchas funciones para el manejo y formateo de fechas, deberías darle un vistazo:

http://dev.mysql.com/doc/refman/5.0/...functions.html

Ahora bien, volvamos a tu problema: no hay ningún inconveniente en dejar el valor por default para tu columna timestamp, siempre podrás insertar los valores con el formato que quieras, checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (
  2.     -> campo VARCHAR(10));
  3. Query OK, 0 rows affected (0.08 sec)
  4.  
  5. mysql> INSERT INTO tabla (campo) VALUES ('uno');
  6. Query OK, 1 row affected (0.06 sec)
  7.  
  8. mysql> INSERT INTO tabla (fecha, campo) VALUES (NULL, 'dos');
  9. Query OK, 1 row affected (0.03 sec)
  10.  
  11. mysql> INSERT INTO tabla (fecha, campo) VALUES (NOW(), 'tres');
  12. Query OK, 1 row affected (0.03 sec)
  13.  
  14. mysql> INSERT INTO tabla (fecha, campo) VALUES ('1970-01-01', 'cuatro');
  15. Query OK, 1 row affected (0.05 sec)
  16.  
  17. mysql> SELECT * FROM tabla;
  18. +---------------------+--------+
  19. | fecha               | campo  |
  20. +---------------------+--------+
  21. | 2012-02-07 09:12:42 | uno    |
  22. | 2012-02-07 09:12:42 | dos    |
  23. | 2012-02-07 09:12:42 | tres   |
  24. | 1970-01-01 00:00:00 | cuatro |
  25. +---------------------+--------+
  26. 4 rows in set (0.00 sec)

Observa que el campo FECHA tiene como DEFAULT el valor CURRENT_TIMESTAMP, de tal manera que puedes hacer inserts sin mencionar el campo, enviando un NULL, utilizando la función NOW() (o calquier otra función para recuperar fecha como currdate) o inclusive enviando una cadena en formato ANSI ('1970-01-01'), aquí no se necesita hacer ninguna conversión.

Sin embargo, no podrías hacer un insert directo con una cadena que no tenga el formato ANSI:

Código MySQL:
Ver original
  1. mysql> INSERT INTO tabla
  2.     -> VALUES ('28/02/2011 13:02:59', 'cinco');
  3. ERROR 1292 (22007): Incorrect datetime value: '28/02/2011 13:02:59' for column 'fecha' at  row 1

En este caso sería necesario utilizar las funciones para convertir cadenas a fechas, como STR_TO_DATE:

Código MySQL:
Ver original
  1. mysql> INSERT INTO tabla VALUES
  2.     -> (STR_TO_DATE('28/02/2011 13:02:59', '%d/%m/%Y %H:%i:%s'), 'cinco');
  3. Query OK, 1 row affected (0.06 sec)
  4.  
  5. mysql> SELECT * FROM tabla;
  6. +---------------------+--------+
  7. | fecha               | campo  |
  8. +---------------------+--------+
  9. | 2011-02-28 13:02:59 | cinco  |
  10. +---------------------+--------+
  11. 6 rows in set (0.02 sec)

Observa que la fecha se sigue almacenando con formato ANSI, aunque al momento del insert yo le estoy enviando un formato dd/mm/yyyy... para recuperar la información en este mismo formato tendría que hacer uso de la función DATE_FORMAT:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +---------------------+--------+
  3. | fecha               | campo  |
  4. +---------------------+--------+
  5. | 2012-02-07 09:12:42 | uno    |
  6. | 2012-02-07 09:12:42 | dos    |
  7. | 2012-02-07 09:12:42 | tres   |
  8. | 1970-01-01 00:00:00 | cuatro |
  9. | 2011-02-28 13:02:59 | cinco  |
  10. +---------------------+--------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT DATE_FORMAT(fecha, '%d/%m/%Y %H:%i:%s') fecha, campo
  14.     -> FROM tabla;
  15. +---------------------+--------+
  16. | fecha               | campo  |
  17. +---------------------+--------+
  18. | 07/02/2012 09:12:42 | uno    |
  19. | 07/02/2012 09:12:42 | dos    |
  20. | 07/02/2012 09:12:42 | tres   |
  21. | 01/01/1970 00:00:00 | cuatro |
  22. | 28/02/2011 13:02:59 | cinco  |
  23. +---------------------+--------+
  24. 5 rows in set (0.00 sec)

Espero que con esto se aclaren tus dudas.

Saludos
Leo.