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

date_format no me esta funcionando, que tengo mal?

Estas en el tema de date_format no me esta funcionando, que tengo mal? en el foro de Mysql en Foros del Web. Hola amigos, Realmente yo creo que no aprecio el error porq llego ya un ratote tecleando codigo y creo es por eso que no veo ...
  #1 (permalink)  
Antiguo 08/11/2012, 15:11
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Exclamación date_format no me esta funcionando, que tengo mal?

Hola amigos,
Realmente yo creo que no aprecio el error porq llego ya un ratote tecleando codigo y creo es por eso que no veo el error xD

Simplemente deseo buscar un rango de fechas my columna tiene un formato DATE TIME y mi query es el sig:

Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE FECHA_SALDADA >= DATE_FORMAT( '01-11-2012', '%d-%m-%Y' )
  3. AND FECHA_SALDADA <= DATE_FORMAT( '30-11-2012', '%d-%m-%Y' )
En en la columna de FECHA_SALDADA los tengo guardados en este formato: 2012-11-08 12:56:25 (año-mes-dia - hora) , pero solo necesito la pura fecha

No logro entender porque no me arroja los datos en ese rango de timpo, ya que si cuento con datos :S

Alguien me podria decir que tengo mal?

Gracias!

Última edición por gnzsoloyo; 08/11/2012 a las 17:55 Razón: Mal etiquetado
  #2 (permalink)  
Antiguo 08/11/2012, 16:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: date_format no me esta funcionando, que tengo mal?

Bueno despues de estar de curioso mejor me fui directo al panel de busqueda de phpMyAdmin de mi cpanel le di buscar por fecha y por lo visto es asi:

Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE FECHA_SALDADA >= '2012-11-01 00:00:00'
  3. AND FECHA_SALDADA <=  '2012-11-30 00:00:00'
El problema es que obviamente tiene que ir con el formato como esta en la base de datos AÑO,MES,DIA , entonces esta opcion funciona si realizan la busqueda con el mismo patron :S , pero sigo en las mismas, solo le puedo asignar el formato con DATE_TIME

Última edición por gnzsoloyo; 08/11/2012 a las 17:56
  #3 (permalink)  
Antiguo 08/11/2012, 16:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: date_format no me esta funcionando, que tengo mal?

Hola marco64yes:

Creo que no te tomaste el tiempo suficiente como para leer bien la documentación... DATE_FORMAT

Cita:
DATE_FORMAT(date,format)

Formatea el valor date según la cadena format . Los siguientes especificadores pueden usarse en la cadena
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> DATE_FORMAT('01-11-2012', '%d-%m-%Y' ) tu_fecha,
  3.     -> DATE_FORMAT('2012-11-08 15:58:24', '%d-%m-%Y' ) mi_fecha;
  4. +----------+------------+
  5. | tu_fecha | mi_fecha   |
  6. +----------+------------+
  7. | NULL     | 08-11-2012 |
  8. +----------+------------+
  9. 1 row in set, 1 warning (0.00 sec)

Podrás preguntarte SI EN LOS DOS CASOS SE ESTÁ ENVIANDO UNA CADENA POR QUE EN MI CASO NO FUNCIONA... mucho cuidado, cuando manejas una cadena con formato ANSI (yyyy-mm-dd hh24:mm:ss) SE INTERPRETA COMO UNA FECHA... es por eso que en el segundo casi si funciona. Ahora bien, si lo que quieres es convertir tu cadena a una fecha utilizas la función STR_TO_DATE:

Código MySQL:
Ver original
  1. mysql> SELECT STR_TO_DATE('01-11-2012', '%d-%m-%Y') fecha_correcta;
  2. +----------------+
  3. | fecha_correcta |
  4. +----------------+
  5. | 2012-11-01     |
  6. +----------------+
  7. 1 row in set (0.00 sec)

Aunque en realidad no tienes necesidad de hacer ningúna conversión si utilizas el formato ANSI... podrías hacer algo como esto:


Código:
SELECT *
FROM pagos
WHERE DATE(FECHA_SALDADA) BETWEEN  '2012-11-01' AND '2012-11-30'

o

SELECT *
FROM pagos
WHERE 
  DATE(FECHA_SALDADA) >= '2012-11-01' AND 
  DATE(FECHA_SALDADA) <= '2012-11-30'
La función DATE() te serviría para excluir las horas y considerar sólo la fecha

Código MySQL:
Ver original
  1. mysql> SELECT NOW(), DATE(NOW());
  2. +---------------------+-------------+
  3. | NOW()               | DATE(NOW()) |
  4. +---------------------+-------------+
  5. | 2012-11-08 16:04:43 | 2012-11-08  |
  6. +---------------------+-------------+
  7. 1 row in set (0.00 sec)

Saludos
Leo.
  #4 (permalink)  
Antiguo 08/11/2012, 16:38
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: date_format no me esta funcionando, que tengo mal?

Hola leonardo_jouse
Fue un excelente explicación la que me has proporcionado en verdad muchas gracias!,

Fijate que realice unas pruebas con


Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE FECHA_SALDADA BETWEEN  STR_TO_DATE('08-11-2012', '%d-%m-%Y') AND STR_TO_DATE('08-11-2012', '%d-%m-%Y')
y otro

Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE FECHA_SALDADA =  STR_TO_DATE('08-11-2012', '%d-%m-%Y')
Para ver si funcionaba ya que en la BD yo obtengo las fechas de un calendario en este formato: DIA-MES-AÑO y en mi base de datos estan como (AÑO-MES-DIA) , entonces por eso la funcion DATE() no me funciona :S lo cual te agradezco por que no la conocia.

La que me comentas STR_TO_DATE() no me respeta los rangos,
por ejemplo si ingreso esto:


Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE FECHA_SALDADA
  3. BETWEEN STR_TO_DATE( '01-11-2012', '%d-%m-%Y' )
  4. AND STR_TO_DATE( '08-11-2012', '%d-%m-%Y' )
  5. LIMIT 0 , 30
Solo me muestra las fechas del 3 de noviembre y no las del primero ni las del 8 :S
Realmente no entiendo que esta haciendo mysql que no me respeta los rango que necesito :S

Última edición por gnzsoloyo; 08/11/2012 a las 20:38 Razón: Mal etiquetado de código SQL.
  #5 (permalink)  
Antiguo 08/11/2012, 17:53
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: date_format no me esta funcionando, que tengo mal?

Por lo que veo solo me estra trayendo resultados con la hora 12pm entonces el problema es el tiempo, STR_TO_DATE algo tiene que no valida bien tiempo o que sera?

Ya le puse

Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE FECHA_SALDADA
  3. BETWEEN STR_TO_DATE( '01-11-2012 00:00:00', '%d-%m-%Y %H:%i:%s' )
  4. AND STR_TO_DATE( '30-11-2012 00:00:00', '%d-%m-%Y %H:%i:%s' )
  5. LIMIT 0 , 30
Pero ni asi :S la hora esta causando algun tipo de conflicto ahi
  #6 (permalink)  
Antiguo 08/11/2012, 20:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: date_format no me esta funcionando, que tengo mal?

¿Por qué no haces algo más simple?
SI lo que estás buscando está entre dos fechas, sin importar la hora en que se produzca, entonces no debes compararlo como DATETIME, sino como DATE.
Algo como:
Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE DATE(FECHA_SALDADA) BETWEEN DATE('2012-11-01')AND DATE('2012-11-30')
  3. LIMIT 0, 30

En cuanto a la objeción que le haces a Leo:
Cita:
en mi base de datos estan como (AÑO-MES-DIA) , entonces por eso la funcion DATE() no me funciona
Eso es absolutamente imposible, como puedo mostrártelo haciendo esta muestra:
Código MySQL:
Ver original
  1. mysql> SELECT DATE('2012-10-01 12:45:22') FECHA1, DATE('2012-10-31') FECHA2;
  2. +------------+------------+
  3. | FECHA1     | FECHA2     |
  4. +------------+------------+
  5. | 2012-10-01 | 2012-10-31 |
  6. +------------+------------+
  7. 1 row in set (0.00 sec)
Esto es posible porque MySQL trabaja a nivel contextual, y realiza ciertas conversiones implícitas, cosa que otros DBMS no admiten. En este caso, como uso la función DATE() sobre una cadena que tiene el formato correcto, el sistema aplica la conversión a fecha.
Entonces, si tu campo es un DATETIME, como pareces afirmar, la conversión forzosamente tiene que funcionar. Ahora bien, si usaste un VARCHAR, en tanto los datos estén correctamente escritos también debe funcionar.
En ese último caso el único problema es que no debiste usar un VARCHAR para almacenar una fecha. Eso no se hace, porque puede generar muchos problemas si hay errores de entrada de datos, y baja performance en las consultas masivas.

Posdata: Por favor, usa la etiqueta correcta para los códigos de las consultas. PHP, no es SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 09/11/2012, 14:42
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: date_format no me esta funcionando, que tengo mal?

mmm :S me gustaria saber si lo han intentando con el orden de DIA-MES-AÑO, hice la prueba asi:

formato DIA-MES-AÑO resultado: 0 valores. <--- Este formato necesito yo

Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE DATE( FECHA_SALDADA )
  3. BETWEEN DATE( '08-11-2012' )
  4. AND DATE( '08-11-2012' )
  5. LIMIT 0 , 30

formato AÑO-MES-DIA (como lo maneja mysql por default) resultado: exitoso con valores.
Código MySQL:
Ver original
  1. FROM pagos
  2. WHERE DATE( FECHA_SALDADA )
  3. BETWEEN DATE( '2012-11-08' )
  4. AND DATE( '2012-11-08' )
  5. LIMIT 0 , 30
Por eso mencionaba que con DATE() no me funcionaba realizar una busqueda con el formato DIA-MES-AÑO, :S ,creo que tendre que realizar una funcion en php que haga este cambio de valores :S ya para que mysql no de lata.

Si ya no hay mas trucos bajo la manga entiendo :) , aprecio su ayuda!!! gracias

Última edición por gnzsoloyo; 09/11/2012 a las 18:04
  #8 (permalink)  
Antiguo 09/11/2012, 14:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: date_format no me esta funcionando, que tengo mal?

No confundas el formato de almacenamiento en la tabla, con el formato de representación en pantalla.
Que lo almacenes en la tabla (como corresponde) como YYYY-MM-DD, no implica de ninguna forma que no lo puedas obtener en la consulta como DD-MM-YYYY. Son cosas completamente diferentes.
Lo que necesitamos, para saber qué pasa, es que nos digas que tipo de columna usaste para almacenar esos datos en ese campo, y si es VARCHAR, que verifiques que todos los registros están escritos en el formato correcto.
Por lo que parece tienes algún defecto en los datos de la tabla, pero necesitamos tener claro cuál es.


Empieza por contestar esta pregunta y desde allí avanzaremos, porque ese es el corazon del problema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 09/11/2012, 15:12
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: date_format no me esta funcionando, que tengo mal?

Hola!!
Muchas gracias por la respuesta, pense que ya estaba muerto :S
Ok, sere aun mas preciso este es el formato de mi columna:

`FECHA_SALDADA` datetime NOT NULL,

Tal cual lo saque del mysql del phpmyadmin.
  #10 (permalink)  
Antiguo 09/11/2012, 15:21
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: date_format no me esta funcionando, que tengo mal?

Para mejores reseñas xD esta es mi tabla:

Código PHP:
--------------------------------------------------------

--
-- 
Estructura de tabla para la tabla `pagos`
--

CREATE TABLE IF NOT EXISTS `pagos` (
  `
IDint(11NOT NULL AUTO_INCREMENT,
  `
IDUSRint(11NOT NULL,
  `
CONCEPTOvarchar(100COLLATE utf8_unicode_ci NOT NULL,
  `
MONTOvarchar(10COLLATE utf8_unicode_ci NOT NULL,
  `
FECHAdatetime NOT NULL,
  `
FECHA_SALDADAdatetime NOT NULL,
  `
BAJAint(1NOT NULL COMMENT,
  `
USUARIOint(11NOT NULL COMMENT,
  
PRIMARY KEY (`ID`),
  
UNIQUE KEY `ID` (`ID`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=124 ;

--
-- 
Volcado de datos para la tabla `pagos`
--

INSERT INTO `pagos` (`ID`, `IDUSR`, `CONCEPTO`, `MONTO`, `FECHA`, `FECHA_SALDADA`, `BAJA`, `USUARIO`) VALUES
(122151'DEUDA 1''70''0000-00-00 00:00:00''2012-11-08 19:50:22'026),
(
123151'DEUDA 2''70''0000-00-00 00:00:00''2012-11-08 19:50:22'026),
(
121151'DEUDA 3''70''0000-00-00 00:00:00''2012-11-08 19:50:22'126); 
  #11 (permalink)  
Antiguo 09/11/2012, 16:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: date_format no me esta funcionando, que tengo mal?

Hola de nuevo marco64yes:

No entiendo cuál es el problema... desde el primer post te puse tres soluciones distintas las cuales deberían funcionar, sin embargo no entiendo por qué insistes en decir que no no funcionan:

Código MySQL:
Ver original
  1. WHERE DATE(FECHA_SALDADA) BETWEEN  '2012-11-01' AND '2012-11-30'
  2.  
  3.   DATE(FECHA_SALDADA) >= '2012-11-01' AND
  4.   DATE(FECHA_SALDADA) <= '2012-11-30'
  5.  
  6.   DATE(FECHA_SALDADA) BETWEEN  
  7.   STR_TO_DATE('01-11-2012', '%d-%m-%Y') AND
  8.   STR_TO_DATE('30-11-2012', '%d-%m-%Y');


Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   `ID`, `IDUSR`, `CONCEPTO`, `MONTO`,
  3.     ->   `FECHA_SALDADA`, `BAJA`, `USUARIO`
  4.     -> FROM pagos;
  5. +-----+-------+----------+-------+---------------------+------+---------+
  6. | ID  | IDUSR | CONCEPTO | MONTO | FECHA_SALDADA       | BAJA | USUARIO |
  7. +-----+-------+----------+-------+---------------------+------+---------+
  8. | 121 |   151 | DEUDA 3  | 70    | 2012-10-31 23:59:59 |    1 |      26 |
  9. | 122 |   151 | DEUDA 3  | 70    | 2012-11-01 00:00:00 |    1 |      26 |
  10. | 123 |   151 | DEUDA 3  | 70    | 2012-11-08 19:50:22 |    1 |      26 |
  11. | 124 |   151 | DEUDA 3  | 70    | 2012-11-30 23:59:59 |    1 |      26 |
  12. | 125 |   151 | DEUDA 3  | 70    | 2012-12-01 00:00:00 |    1 |      26 |
  13. +-----+-------+----------+-------+---------------------+------+---------+
  14. 5 rows in set (0.00 sec)
  15.  
  16. mysql> SELECT
  17.     ->   `ID`, `IDUSR`, `CONCEPTO`, `MONTO`,
  18.     ->   `FECHA_SALDADA`, `BAJA`, `USUARIO`
  19.     -> FROM pagos
  20.     -> WHERE
  21.     ->   DATE(FECHA_SALDADA) >= '2012-11-01' AND
  22.     ->   DATE(FECHA_SALDADA) <= '2012-11-30';
  23. +-----+-------+----------+-------+---------------------+------+---------+
  24. | ID  | IDUSR | CONCEPTO | MONTO | FECHA_SALDADA       | BAJA | USUARIO |
  25. +-----+-------+----------+-------+---------------------+------+---------+
  26. | 122 |   151 | DEUDA 3  | 70    | 2012-11-01 00:00:00 |    1 |      26 |
  27. | 123 |   151 | DEUDA 3  | 70    | 2012-11-08 19:50:22 |    1 |      26 |
  28. | 124 |   151 | DEUDA 3  | 70    | 2012-11-30 23:59:59 |    1 |      26 |
  29. +-----+-------+----------+-------+---------------------+------+---------+
  30. 3 rows in set (0.00 sec)
  31.  
  32. mysql> SELECT
  33.     ->   `ID`, `IDUSR`, `CONCEPTO`, `MONTO`,
  34.     ->   `FECHA_SALDADA`, `BAJA`, `USUARIO`
  35.     -> FROM pagos
  36.     -> WHERE DATE(FECHA_SALDADA) BETWEEN  '2012-11-01' AND '2012-11-30';
  37. +-----+-------+----------+-------+---------------------+------+---------+
  38. | ID  | IDUSR | CONCEPTO | MONTO | FECHA_SALDADA       | BAJA | USUARIO |
  39. +-----+-------+----------+-------+---------------------+------+---------+
  40. | 122 |   151 | DEUDA 3  | 70    | 2012-11-01 00:00:00 |    1 |      26 |
  41. | 123 |   151 | DEUDA 3  | 70    | 2012-11-08 19:50:22 |    1 |      26 |
  42. | 124 |   151 | DEUDA 3  | 70    | 2012-11-30 23:59:59 |    1 |      26 |
  43. +-----+-------+----------+-------+---------------------+------+---------+
  44. 3 rows in set (0.00 sec)
  45.  
  46. mysql> SELECT
  47.     ->   `ID`, `IDUSR`, `CONCEPTO`, `MONTO`,
  48.     ->   `FECHA_SALDADA`, `BAJA`, `USUARIO`
  49.     -> FROM pagos
  50.     -> WHERE DATE(FECHA_SALDADA) BETWEEN
  51.     -> STR_TO_DATE('01-11-2012', '%d-%m-%Y') AND
  52.     -> STR_TO_DATE('30-11-2012', '%d-%m-%Y');
  53. +-----+-------+----------+-------+---------------------+------+---------+
  54. | ID  | IDUSR | CONCEPTO | MONTO | FECHA_SALDADA       | BAJA | USUARIO |
  55. +-----+-------+----------+-------+---------------------+------+---------+
  56. | 122 |   151 | DEUDA 3  | 70    | 2012-11-01 00:00:00 |    1 |      26 |
  57. | 123 |   151 | DEUDA 3  | 70    | 2012-11-08 19:50:22 |    1 |      26 |
  58. | 124 |   151 | DEUDA 3  | 70    | 2012-11-30 23:59:59 |    1 |      26 |
  59. +-----+-------+----------+-------+---------------------+------+---------+
  60. 3 rows in set (0.00 sec)

En los tres casos regresa sólo los registros comprendidos entre las dos fechas... es decir, todos los registros comprendidos del mes de noviembre, entonces cuál es el problema???

Saludos
Leo.
  #12 (permalink)  
Antiguo 09/11/2012, 17:17
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: date_format no me esta funcionando, que tengo mal?

Hola Leo!

Muchas gracias me funciono perfecto con:

SELECT * FROM pagos WHERE DATE(FECHA_SALDADA) BETWEEN STR_TO_DATE('08-11-2012', '%d-%m-%Y') AND STR_TO_DATE('08-11-2012', '%d-%m-%Y')

Creo que fue la combinacion de DATE y STR_TO_DATE

Muchas gracias!!
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 18:08.