Una de las cosas con las que toca lidiar practicamente siempre que trabajamos con fechas contra una base de datos MySQL es que la base va
a almacenar las fechas de la manera ISO «año-mes-dia» y nosotros a la hora de trabajar trabajos con el formato Europeo, ya sea «dia-mes-año» o «dia/mes/año».
Durante muchos años trabajaba con la tecnica de la función bidireccional, es decir, me creaba una función la cual cuando le llegaba la fecha la convertia en un sentido u otro.
function cambiaFormatoFecha($fechaOriginal)
{
//Dividimos la fecha de la hora si existe
$partesStamp = explode(" ", $fechaOriginal);
// La primera parte es la fecha, la segunda la hora
$partesFecha = explode ( "-", $partesStamp[0] );
// La fecha final
return $partesFecha[2] ."-".$partesFecha[1]."-".$partesFecha[0];
}
MySQL guarda las fechas separadas por guiones, así que si nosotros definimos el formato de fecha separado con guiones, pues eso que tenemos ganado y esta función nos convierte tanto nuestras fechas cuando las introducimos como las fechas que devuelve el MySQL.
Trabajar con esto puede parecer que es una gran ventaja, pero la verdad que a nivel de rendimiento no lo es ya que supone ejecutar la función cada vez que aparezca un registro de fecha.
Una solución bastante mas eficiente es la de procesar las fechas en la consulta. Para eso utilizaremos las funciones incorporadas de MySQL DATE_FORMAT y STR_TO_DATE.
Si queremos unos registros de una determinada fecha podemos hacer:
SELECT * FROM `tabla` WHERE fecha LIKE STR_TO_DATE('mifecha','%d-%m-%Y);
En esta consulta mifecha esta en el formato dia-mes-año
Si queremos ver las fechas en el formato dia-mes-año
SELECT DATE_FORMAT(fecha,'%d-%m-%Y) FROM `tabla`;
Para mas información
STR_TO_DATE http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_str-to-date
DATE_FORMAT http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-format