Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/07/2013, 12:27
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: convertir fecha con date_format o str_to_date en el where no funca

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. mysql> SELECT STR_TO_DATE('12/08/2013', '%Y-%m-%d %H:%i:%s');
  2. +------------------------------------------------+
  3. | STR_TO_DATE('12/08/2013', '%Y-%m-%d %H:%i:%s') |
  4. +------------------------------------------------+
  5. | NULL                                           |
  6. +------------------------------------------------+
  7. 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
  1. mysql> SELECT STR_TO_DATE('12/08/2013', '%d/%m/%Y');
  2. +---------------------------------------+
  3. | STR_TO_DATE('12/08/2013', '%d/%m/%Y') |
  4. +---------------------------------------+
  5. | 2013-08-12                            |
  6. +---------------------------------------+
  7. 1 row in set (0.00 sec)


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
  1. mysql> SELECT STR_TO_DATE('Hoy es 12 del 07 del 2013', 'Hoy es %d del %m del %Y');
  2. +---------------------------------------------------------------------+
  3. | STR_TO_DATE('Hoy es 12 del 07 del 2013', 'Hoy es %d del %m del %Y') |
  4. +---------------------------------------------------------------------+
  5. | 2013-07-12                                                          |
  6. +---------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)

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. mysql> SELECT DATE_FORMAT('12/08/2013', '%Y-%m-%d %H:%i:%s');
  2. +------------------------------------------------+
  3. | DATE_FORMAT('12/08/2013', '%Y-%m-%d %H:%i:%s') |
  4. +------------------------------------------------+
  5. | NULL                                           |
  6. +------------------------------------------------+
  7. 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
  1. mysql> SELECT DATE_FORMAT('2013-07-23 09:48:33', 'Anio: %Y -> Mes: %m -> Dia: %d');
  2. +----------------------------------------------------------------------+
  3. | DATE_FORMAT('2013-07-23 09:48:33', 'Anio: %Y -> Mes: %m -> Dia: %d') |
  4. +----------------------------------------------------------------------+
  5. | Anio: 2013 -> Mes: 07 -> Dia: 23                                     |
  6. +----------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)

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 original
  1. FROM tabla
  2. WHERE 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
  1. mysql> SELECT *
  2.     -> FROM tabla
  3.     -> WHERE DATE(fecha_fin) >= STR_TO_DATE('29/07/2013', '%d/%m/%Y') AND
  4.     -> DATE(fecha_fin) <= STR_TO_DATE('29/07/2013', '%d/%m/%Y');
  5. +---------------------+
  6. | fecha_fin           |
  7. +---------------------+
  8. | 2013-07-29 09:49:56 |
  9. +---------------------+
  10. 1 row in set (0.02 sec)

O si lo prefieres, utilizar el formato ANSI:

Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM tabla
  3.     -> WHERE
  4.     ->    DATE(fecha_fin) >= '2013-07-29' AND
  5.     ->    DATE(fecha_fin) <= '2013-07-29';
  6. +---------------------+
  7. | fecha_fin           |
  8. +---------------------+
  9. | 2013-07-29 09:49:56 |
  10. +---------------------+
  11. 1 row in set (0.00 sec)

Haz la prueba, pregunta a SAN GOOGLE por ejemplos del manejo de fechas en MySQL si es que continuas con dudas.

Saludos
Leo.