Hola catpaw:
Mucho ojo, estás entendiendo mal cómo trabajan las funciones STR_TO_DATE y DATE_FORMAT...
La primera sirve para convertir una CADENA DE CARACTERES a una fecha... recibe dos parámetros... la CADENA y el FORMATO DE FECHA que se supone tiene la cadena... es decir, si tu haces esto:
Código MySQL:
Ver original+------------------------------------------------+
+------------------------------------------------+
+------------------------------------------------+
1 row
in set, 1 warning
(0.13 sec
)
Observa que el resultado es un NULL esto es porque el formato que estás colocando NO CORRESPONDE AL QUE TIENE LA CADENA... tu cadena está en formato dd/mm/yyyy, por lo tanto, para convertir la cadena a fecha tendrías que hacerlo así:
Código MySQL:
Ver original+---------------------------------------+
+---------------------------------------+
| 2013-08-12 |
+---------------------------------------+
es decir, en el FORMATO especificas cómo está guardada tu cadena:
Si tuvieras una cadena así "Hoy es 12 del 07 del 2003" podrías hacer los siguiente:
Código MySQL:
Ver original+---------------------------------------------------------------------+
| STR_TO_DATE('Hoy es 12 del 07 del 2013', 'Hoy es %d del %m del %Y') | +---------------------------------------------------------------------+
| 2013-07-12 |
+---------------------------------------------------------------------+
La función DATE_FORMAT sirve para convertir una fecha AL FORMATO QUE TU QUIERAS... recordando que en MySQL las fechas se almacenan en formato ANSI (yyyy-mm-dd hh24:mi:ss). Si tu haces esto:
Código MySQL:
Ver original+------------------------------------------------+
+------------------------------------------------+
+------------------------------------------------+
1 row
in set, 1 warning
(0.08 sec
)
El resultado también es NULO, porque la cadena que pones como primer parámetro NO SIGUE EL FORMATO ANSI. La función FORMAT trabaja asi:
Código MySQL:
Ver original+----------------------------------------------------------------------+
| DATE_FORMAT('2013-07-23 09:48:33', 'Anio: %Y -> Mes: %m -> Dia: %d') | +----------------------------------------------------------------------+
| Anio: 2013 -> Mes: 07 -> Dia: 23 |
+----------------------------------------------------------------------+
es decir, convierte una fecha en formato ANSI al formato que tú le indiques...
Tal como lo mencionas, las consultas con fechas funcionan si manejas el formato ANSI, es por eso que la única consulta que te funciona es esta:
Código MySQL:
Ver originalWHERE fecha_fin
>= '2013-07-12 09:48:33' AND fecha_fin
<= '2013-08-12 09:48:33'
Ojo con eso. Podrías hacer las siguientes comparaciones:
Código:
SELECT *
FROM tabla
WHERE
fecha_fin >= STR_TO_DATE('12/07/2013', '%d/%m/%Y') AND
fecha_fin <= STR_TO_DATE('12/07/2013', '%d/%m/%Y');
Teniendo en cuenta que DATETIME almacena también la hora... si quieres comparar sólo la fecha tendrías qhe hacer algo como esto:
Código MySQL:
Ver original+---------------------+
| fecha_fin |
+---------------------+
| 2013-07-29 09:49:56 |
+---------------------+
O si lo prefieres, utilizar el formato ANSI:
Código MySQL:
Ver original -> DATE(fecha_fin
) >= '2013-07-29' AND -> DATE(fecha_fin
) <= '2013-07-29'; +---------------------+
| fecha_fin |
+---------------------+
| 2013-07-29 09:49:56 |
+---------------------+
Haz la prueba, pregunta a SAN GOOGLE por ejemplos del manejo de fechas en MySQL si es que continuas con dudas.
Saludos
Leo.