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

Select con fecha

Estas en el tema de Select con fecha en el foro de Mysql en Foros del Web. Tengo una tabla que tiene un campo Fecha_nacimiento de tipo DATE. Yo quiero listar todas los que hayan nacido luego del 30-01-1980. Y hago un ...
  #1 (permalink)  
Antiguo 16/03/2012, 08:45
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años, 6 meses
Puntos: 7
Pregunta Select con fecha

Tengo una tabla que tiene un campo Fecha_nacimiento de tipo DATE.

Yo quiero listar todas los que hayan nacido luego del 30-01-1980.

Y hago un select:

Código HTML:
select * from personal where fecha_nacimiento > str_to_date('1980-01-30')
Y el MySQLWorkbench me dice Parametro Incorrecto.
He invertido el orden A '30-01-1980' y nada.
Cómo soluciono esto?
__________________
Todos somos iguales. NO! a la violencia de género.
  #2 (permalink)  
Antiguo 16/03/2012, 09:10
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Select con fecha

Hola Bandolera:

Si observas la sintaxis de la función STR_TO_DATE, se necesitan DOS PARÁMETROS, el primero es la cadena que quieres convertir y el segundo EL FORMATO DE FECHA QUE TIENE LA CADENA:

STR_TO_DATE(str,format)

Sin embargo, no hay necesidad de convertir la cadena a fecha SI LA PONES EN FORMATO ANSI (yyyy-mm-dd), tal como lo estás haciendo). Checa este script.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM fechas;
  2. +------------+
  3. | campo      |
  4. +------------+
  5. | 1980-01-28 |
  6. | 1980-01-29 |
  7. | 1980-01-30 |
  8. | 1980-01-31 |
  9. | 1980-02-01 |
  10. | 1980-02-02 |
  11. +------------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT * FROM fechas
  15.     -> WHERE campo > STR_TO_DATE('30-01-1980', '%d-%m-%Y');
  16.  
  17. +------------+
  18. | campo      |
  19. +------------+
  20. | 1980-01-31 |
  21. | 1980-02-01 |
  22. | 1980-02-02 |
  23. +------------+
  24. 3 rows in set (0.00 sec)
  25. mysql> SELECT * FROM fechas WHERE campo > '1980-01-30';
  26. +------------+
  27. | campo      |
  28. +------------+
  29. | 1980-01-31 |
  30. | 1980-02-01 |
  31. | 1980-02-02 |
  32. +------------+
  33. 3 rows in set (0.02 sec)

En el segundo ejemplo, aunque compares una fecha contra una "cadena", también se hace la comparación.

P.D. Linda Imagen la que tienes aunque supongo que debería decir linda tú...

Saludos
Leo.
  #3 (permalink)  
Antiguo 19/03/2012, 15:23
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años, 6 meses
Puntos: 7
Sonrisa Respuesta: Select con fecha

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola Bandolera:

Si observas la sintaxis de la función STR_TO_DATE, se necesitan DOS PARÁMETROS, el primero es la cadena que quieres convertir y el segundo EL FORMATO DE FECHA QUE TIENE LA CADENA:

STR_TO_DATE(str,format)

Sin embargo, no hay necesidad de convertir la cadena a fecha SI LA PONES EN FORMATO ANSI (yyyy-mm-dd), tal como lo estás haciendo). Checa este script.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM fechas;
  2. +------------+
  3. | campo      |
  4. +------------+
  5. | 1980-01-28 |
  6. | 1980-01-29 |
  7. | 1980-01-30 |
  8. | 1980-01-31 |
  9. | 1980-02-01 |
  10. | 1980-02-02 |
  11. +------------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT * FROM fechas
  15.     -> WHERE campo > STR_TO_DATE('30-01-1980', '%d-%m-%Y');
  16.  
  17. +------------+
  18. | campo      |
  19. +------------+
  20. | 1980-01-31 |
  21. | 1980-02-01 |
  22. | 1980-02-02 |
  23. +------------+
  24. 3 rows in set (0.00 sec)
  25. mysql> SELECT * FROM fechas WHERE campo > '1980-01-30';
  26. +------------+
  27. | campo      |
  28. +------------+
  29. | 1980-01-31 |
  30. | 1980-02-01 |
  31. | 1980-02-02 |
  32. +------------+
  33. 3 rows in set (0.02 sec)

En el segundo ejemplo, aunque compares una fecha contra una "cadena", también se hace la comparación.

P.D. Linda Imagen la que tienes aunque supongo que debería decir linda tú...

Saludos
Leo.
Interesante y si quiero hacer lo mismo pero con un campo timestamp ?
supongo que es igual. Cierto?

Y gracias por lo de mi foto
__________________
Todos somos iguales. NO! a la violencia de género.
  #4 (permalink)  
Antiguo 20/03/2012, 09:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Select con fecha

Hola de nuevo bandolera:

El manejo de fechas y horas en MySQL es bastante flexible, aunque esta flexibilidad no necesariamente es buena... Checa esta liga:

http://dev.mysql.com/doc/refman/5.0/es/datetime.html

Ahí podrás darte cuenta de algunas de las propiedades que tienen los tipos de dato de fecha y hora. Como te comenté, hay muchas formas de manejar estos campos sin necesidad de hacer conversiones. Checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (campo_date DATE, campo_datetime DATETIME,
  2.     -> campo_timestamp TIMESTAMP, campo_time TIME);
  3. Query OK, 0 rows affected (0.11 sec)
  4.  
  5. mysql> INSERT INTO tabla VALUES
  6.     -> ('2012-03-19', '2012-03-19 09:10:00', NOW(), '09:10:00'),
  7.     -> (CURDATE(), '2012-03-20 09:10:00', NOW(), CURTIME()),
  8.     -> (STR_TO_DATE('03&&2012//20', '%m&&%Y//%d'), NOW(), NOW(), '09:10:00'),
  9.     -> ('20120321', '2012@03@20 09@10@00', '2012-03-20 09:10:00', '091000');
  10. Query OK, 4 rows affected (0.03 sec)
  11. Records: 4  Duplicates: 0  Warnings: 0
  12.  
  13. mysql> SELECT * FROM tabla;
  14. +------------+---------------------+---------------------+------------+
  15. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  16. +------------+---------------------+---------------------+------------+
  17. | 2012-03-19 | 2012-03-19 09:10:00 | 2012-03-20 09:26:44 | 09:10:00   |
  18. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  19. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  20. | 2012-03-21 | 2012-03-20 09:10:00 | 2012-03-20 09:10:00 | 09:10:00   |
  21. +------------+---------------------+---------------------+------------+
  22. 4 rows in set (0.00 sec)
  23.  
  24. mysql> SELECT * FROM tabla WHERE campo_date >= '2012-03-20';
  25. +------------+---------------------+---------------------+------------+
  26. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  27. +------------+---------------------+---------------------+------------+
  28. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  29. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  30. | 2012-03-21 | 2012-03-20 09:10:00 | 2012-03-20 09:10:00 | 09:10:00   |
  31. +------------+---------------------+---------------------+------------+
  32. 3 rows in set (0.00 sec)
  33.  
  34. mysql> SELECT * FROM tabla
  35.     -> WHERE campo_datetime >= '2012@03@20 09*20*00';
  36. +------------+---------------------+---------------------+------------+
  37. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  38. +------------+---------------------+---------------------+------------+
  39. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  40. +------------+---------------------+---------------------+------------+
  41. 1 row in set (0.00 sec)
  42.  
  43. mysql> SELECT * FROM tabla
  44.     -> WHERE campo_timestamp >=
  45.     -> STR_TO_DATE('2012!03?20 09(20)00', '%Y!%m?%d %H(%i)%s');
  46. +------------+---------------------+---------------------+------------+
  47. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  48. +------------+---------------------+---------------------+------------+
  49. | 2012-03-19 | 2012-03-19 09:10:00 | 2012-03-20 09:26:44 | 09:10:00   |
  50. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  51. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  52. +------------+---------------------+---------------------+------------+
  53. 3 rows in set (0.00 sec)
  54.  
  55. mysql> SELECT * FROM tabla WHERE campo_time > '09:10:00';
  56. +------------+---------------------+---------------------+------------+
  57. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  58. +------------+---------------------+---------------------+------------+
  59. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  60. +------------+---------------------+---------------------+------------+
  61. 1 row in set (0.02 sec)

A pesar de que MySQL te permite utilizar estas distintas formas de manejar la fecha, en lo particular y tal como te lo comenté en el post pasado SIEMPRE RECOMIENDO UTILIZAR EL FORMATO ANSI (yyyy-mm-dd hh:mi:ss), ya que este es el estándar que utilizan la mayoría de los DBMS, pero la decisión final la tienes tu.

En cuanto al comentario de tu foto, no tienes nada que agradecer... Eres linda y no se necesita ser un experto para darse cuenta de ello...

Saludo
Leo.
  #5 (permalink)  
Antiguo 24/03/2012, 18:37
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años, 6 meses
Puntos: 7
Pregunta Respuesta: Select con fecha

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola de nuevo bandolera:

El manejo de fechas y horas en MySQL es bastante flexible, aunque esta flexibilidad no necesariamente es buena... Checa esta liga:

http://dev.mysql.com/doc/refman/5.0/es/datetime.html

Ahí podrás darte cuenta de algunas de las propiedades que tienen los tipos de dato de fecha y hora. Como te comenté, hay muchas formas de manejar estos campos sin necesidad de hacer conversiones. Checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (campo_date DATE, campo_datetime DATETIME,
  2.     -> campo_timestamp TIMESTAMP, campo_time TIME);
  3. Query OK, 0 rows affected (0.11 sec)
  4.  
  5. mysql> INSERT INTO tabla VALUES
  6.     -> ('2012-03-19', '2012-03-19 09:10:00', NOW(), '09:10:00'),
  7.     -> (CURDATE(), '2012-03-20 09:10:00', NOW(), CURTIME()),
  8.     -> (STR_TO_DATE('03&&2012//20', '%m&&%Y//%d'), NOW(), NOW(), '09:10:00'),
  9.     -> ('20120321', '2012@03@20 09@10@00', '2012-03-20 09:10:00', '091000');
  10. Query OK, 4 rows affected (0.03 sec)
  11. Records: 4  Duplicates: 0  Warnings: 0
  12.  
  13. mysql> SELECT * FROM tabla;
  14. +------------+---------------------+---------------------+------------+
  15. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  16. +------------+---------------------+---------------------+------------+
  17. | 2012-03-19 | 2012-03-19 09:10:00 | 2012-03-20 09:26:44 | 09:10:00   |
  18. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  19. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  20. | 2012-03-21 | 2012-03-20 09:10:00 | 2012-03-20 09:10:00 | 09:10:00   |
  21. +------------+---------------------+---------------------+------------+
  22. 4 rows in set (0.00 sec)
  23.  
  24. mysql> SELECT * FROM tabla WHERE campo_date >= '2012-03-20';
  25. +------------+---------------------+---------------------+------------+
  26. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  27. +------------+---------------------+---------------------+------------+
  28. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  29. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  30. | 2012-03-21 | 2012-03-20 09:10:00 | 2012-03-20 09:10:00 | 09:10:00   |
  31. +------------+---------------------+---------------------+------------+
  32. 3 rows in set (0.00 sec)
  33.  
  34. mysql> SELECT * FROM tabla
  35.     -> WHERE campo_datetime >= '2012@03@20 09*20*00';
  36. +------------+---------------------+---------------------+------------+
  37. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  38. +------------+---------------------+---------------------+------------+
  39. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  40. +------------+---------------------+---------------------+------------+
  41. 1 row in set (0.00 sec)
  42.  
  43. mysql> SELECT * FROM tabla
  44.     -> WHERE campo_timestamp >=
  45.     -> STR_TO_DATE('2012!03?20 09(20)00', '%Y!%m?%d %H(%i)%s');
  46. +------------+---------------------+---------------------+------------+
  47. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  48. +------------+---------------------+---------------------+------------+
  49. | 2012-03-19 | 2012-03-19 09:10:00 | 2012-03-20 09:26:44 | 09:10:00   |
  50. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  51. | 2012-03-20 | 2012-03-20 09:26:44 | 2012-03-20 09:26:44 | 09:10:00   |
  52. +------------+---------------------+---------------------+------------+
  53. 3 rows in set (0.00 sec)
  54.  
  55. mysql> SELECT * FROM tabla WHERE campo_time > '09:10:00';
  56. +------------+---------------------+---------------------+------------+
  57. | campo_date | campo_datetime      | campo_timestamp     | campo_time |
  58. +------------+---------------------+---------------------+------------+
  59. | 2012-03-20 | 2012-03-20 09:10:00 | 2012-03-20 09:26:44 | 09:26:44   |
  60. +------------+---------------------+---------------------+------------+
  61. 1 row in set (0.02 sec)

A pesar de que MySQL te permite utilizar estas distintas formas de manejar la fecha, en lo particular y tal como te lo comenté en el post pasado SIEMPRE RECOMIENDO UTILIZAR EL FORMATO ANSI (yyyy-mm-dd hh:mi:ss), ya que este es el estándar que utilizan la mayoría de los DBMS, pero la decisión final la tienes tu.

En cuanto al comentario de tu foto, no tienes nada que agradecer... Eres linda y no se necesita ser un experto para darse cuenta de ello...

Saludo
Leo.
Si el campo es timestamp y quiero listar solo la fecha?

Código HTML:
SELECT * FROM fechas WHERE campo = '1980-01-30';
__________________
Todos somos iguales. NO! a la violencia de género.
  #6 (permalink)  
Antiguo 26/03/2012, 09:06
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Select con fecha

Hola de nuevo Bandolera:

Si quieres utilizar sólo la parte de la fecha y omitir la hora debes hacer uso de la función DATE(), ya que de lo contrario es posible que no obtengas los resultados esperados. Cuando iguala una fecha con el formato 'yyyy-mm-dd' pero lo comparas contra un tipo timestamp, automáticamente se asigna una hora por defecto 00:00:00. Checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +---------------------+
  3. | campo_timestamp     |
  4. +---------------------+
  5. | 2012-03-26 00:00:00 |
  6. | 2012-03-26 00:00:01 |
  7. | 2012-03-26 12:12:23 |
  8. +---------------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla WHERE campo_timestamp = '2012-03-26';
  12. +---------------------+
  13. | campo_timestamp     |
  14. +---------------------+
  15. | 2012-03-26 00:00:00 |
  16. +---------------------+
  17. 1 row in set (0.00 sec)
  18.  
  19. mysql> SELECT * FROM tabla WHERE campo_timestamp = '2012-03-26 00:00:00';
  20. +---------------------+
  21. | campo_timestamp     |
  22. +---------------------+
  23. | 2012-03-26 00:00:00 |
  24. +---------------------+
  25. 1 row in set (0.00 sec)

Observa en los dos primeros select's... poner esto

Código:
campo_timestamp = '2012-03-26';
o esto

Código:
campo_timestamp = '2012-03-26 00:00:00';
ES EXACTAMENTE LO MISMO, para filtrar sólo la fecha, omitiendo la hora puedes hacer así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE DATE(campo_timestamp) = '2012-03-26';
  2. +---------------------+
  3. | campo_timestamp     |
  4. +---------------------+
  5. | 2012-03-26 00:00:00 |
  6. | 2012-03-26 00:00:01 |
  7. | 2012-03-26 12:12:23 |
  8. +---------------------+
  9. 3 rows in set (0.03 sec)

Saludos
Leo.
  #7 (permalink)  
Antiguo 28/03/2012, 07:16
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: Select con fecha

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola de nuevo Bandolera:

Si quieres utilizar sólo la parte de la fecha y omitir la hora debes hacer uso de la función DATE(), ya que de lo contrario es posible que no obtengas los resultados esperados. Cuando iguala una fecha con el formato 'yyyy-mm-dd' pero lo comparas contra un tipo timestamp, automáticamente se asigna una hora por defecto 00:00:00. Checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +---------------------+
  3. | campo_timestamp     |
  4. +---------------------+
  5. | 2012-03-26 00:00:00 |
  6. | 2012-03-26 00:00:01 |
  7. | 2012-03-26 12:12:23 |
  8. +---------------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla WHERE campo_timestamp = '2012-03-26';
  12. +---------------------+
  13. | campo_timestamp     |
  14. +---------------------+
  15. | 2012-03-26 00:00:00 |
  16. +---------------------+
  17. 1 row in set (0.00 sec)
  18.  
  19. mysql> SELECT * FROM tabla WHERE campo_timestamp = '2012-03-26 00:00:00';
  20. +---------------------+
  21. | campo_timestamp     |
  22. +---------------------+
  23. | 2012-03-26 00:00:00 |
  24. +---------------------+
  25. 1 row in set (0.00 sec)

Observa en los dos primeros select's... poner esto

Código:
campo_timestamp = '2012-03-26';
o esto

Código:
campo_timestamp = '2012-03-26 00:00:00';
ES EXACTAMENTE LO MISMO, para filtrar sólo la fecha, omitiendo la hora puedes hacer así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE DATE(campo_timestamp) = '2012-03-26';
  2. +---------------------+
  3. | campo_timestamp     |
  4. +---------------------+
  5. | 2012-03-26 00:00:00 |
  6. | 2012-03-26 00:00:01 |
  7. | 2012-03-26 12:12:23 |
  8. +---------------------+
  9. 3 rows in set (0.03 sec)

Saludos
Leo.
Las fechas siempre han sido un dolor de cabeza.
Gracias por el dato.
__________________
Todos somos iguales. NO! a la violencia de género.

Etiquetas: fecha, select, sql, tabla, campos
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:56.