Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

convertir fecha con date_format o str_to_date en el where no funca

Estas en el tema de convertir fecha con date_format o str_to_date en el where no funca en el foro de Mysql en Foros del Web. hola como les va, estoy tratando de comparar una fecha de formato d/m/Y con un date time, he intentado lo siguiente pero no me funcionan: ...
  #1 (permalink)  
Antiguo 12/07/2013, 11:53
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
convertir fecha con date_format o str_to_date en el where no funca

hola como les va,

estoy tratando de comparar una fecha de formato d/m/Y con un date time, he intentado lo siguiente pero no me funcionan:

Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE DATE_FORMAT(fecha_fin, '%d/%m/%Y') >= '12/07/2013' AND DATE_FORMAT(fecha_fin, '%d/%m/%Y') <= '12/08/2013'
  2.  
  3. SELECT * FROM tabla WHERE fecha_fin >= DATE_FORMAT('12/07/2013', '%Y-%m-%d %H:%i:%s') AND fecha_fin <= DATE_FORMAT('12/08/2013', '%Y-%m-%d %H:%i:%s')
  4.  
  5. SELECT * FROM tabla WHERE fecha_fin >= DATE_FORMAT('12/07/2013', '%Y-%m-%d 23:59:59') AND fecha_fin <= DATE_FORMAT('12/08/2013', '%Y-%m-%d 23:59:59')
  6.  
  7. SELECT * FROM tabla WHERE fecha_fin >= STR_TO_DATE('12/07/2013', '%Y-%m-%d %H:%i:%s') AND fecha_fin <= STR_TO_DATE('12/08/2013', '%Y-%m-%d %H:%i:%s')
  8.  
  9. SELECT * FROM tabla WHERE fecha_fin >= STR_TO_DATE('12/07/2013', '%Y-%m-%d 23:59:59') AND fecha_fin <= STR_TO_DATE('12/08/2013', '%Y-%m-%d 23:59:59')

El unico que funciono es este:

Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE fecha_fin >= '2013-07-12 09:48:33' AND fecha_fin <= '2013-08-12 09:48:33'

Pero segun yo para convertir fecha 12/08/2013 a 2013-08-12 09:48:33 se usan:

STR_TO_DATE('12/08/2013', '%Y-%m-%d %H:%i:%s')

o

DATE_FORMAT('12/08/2013', '%Y-%m-%d %H:%i:%s')

no?

entonces porque no resulta??

en mi tabla tengo las siguiente fechas con las que estoy probando:

Código:
+---------------------+
| fecha_fin
+---------------------+
| 2013-07-23 09:48:33 |
| 2013-07-29 09:49:56 |
| 2013-07-14 09:52:56 |
+---------------------+
Gracias
  #2 (permalink)  
Antiguo 12/07/2013, 12:27
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.
  #3 (permalink)  
Antiguo 12/07/2013, 12:48
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: convertir fecha con date_format o str_to_date en el where no funca

Hola leo gracias por tu explicacion,

al final volvi date el campo que tenia datetime porque me di cuenta que no era necesario controlar la hora y pues me estaba complicando de mas,

al final el where quedo asi:

Código MySQL:
Ver original
  1. DATE_FORMAT(fecha_fin, "%d/%m/%Y")  >= '12/07/2013' AND DATE_FORMAT(fecha_fin, "%d/%m/%Y") <= '29/08/2013'
  #4 (permalink)  
Antiguo 12/07/2013, 13:04
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 de nuevo:

No es recomendable que utilices comparaciones de fechas con formatos que no sean ANSI... en lo particular te recomendaría que hagas la comparación de esta forma:

Código:
...
DATE(fecha_fin)  >= '2013-07-02' AND 
DATE(fecha_fin) <= '2013-08-29'
...
El resultado debe ser el mismo, pero no tendrías problemas con el manejo de idioma... ese es el estándar y es como deberías de hacer las comparaciones.

Saludos
Leo.

Etiquetas: fecha, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:21.