Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Diabliyo en 10 Marzo 2011, 04:17 am



Título: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 04:17 am
Buenas.

En mi sistema manejo datos que requiero consultar de MySQL que esten dentro del dia actual, vaya, que los datos que se consulten sean del mes/a~o actual.

Cada vez que se insertan datos nuevos existe una entrada en la tabla llamada FECHA en donde se guarda directamente la fecha obtenida mediante la funcion time().

Como puedo consultar los datos que concuerden con la fecha actual ?

Como solucion (momentanea) lo que hago es esto:

Código
  1. <?php
  2. # Esta es la tabla (fictisia)
  3. # create table DATOS (
  4. #  TITULO VARCHAR(100) not NULL,
  5. #  MENSAJE TEXTnot NULL,
  6. #  FECHA VARCHAR(100) not NULL
  7. #  );
  8.  
  9. $link= conectar();
  10. $cons= mysql_query( "select * from DATOS;", $link );
  11. if( mysql_num_rows($cons) )
  12.    {
  13.    $cont=0; # contador
  14.    while( $buf=mysql_fetch_array($cons) )
  15.        {
  16.        # buscamos entrada del mes y a~o actual
  17.        if( !strcmp( date("m/y", time()), date("m/y", $buf["FECHA"]) ) ) # si es el mes/a~o actual
  18.            $cont++;
  19.        }
  20.    }
  21.  
  22. echo 'Se encontraron en este mes <b>'. $cont. '</b> resultados.';
  23. mysql_close($link);
  24. ?>


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Shell Root en 10 Marzo 2011, 04:30 am
What da faq!
Porque no lo haces directamente en la consulta del MySQL. Es decir,
Código
  1. SELECT *
  2.  FROM DATOS
  3. WHERE (fecha = 'fecha-actual');


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 04:33 am
What da faq!
Porque no lo haces directamente en la consulta del MySQL. Es decir,
Código
  1. SELECT *
  2.  FROM DATOS
  3. WHERE (fecha = 'fecha-actual');

Como ?...

En el scrpt contabilizo las entradas que se hayan echo el MES y A~O actual, como lo haria directo en MySQL ?

Saludos !


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Shell Root en 10 Marzo 2011, 04:43 am
Pero es que no entiendo, explicanos con ejemplos reales.


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 05:01 am
Pero es que no entiendo, explicanos con ejemplos reales.

Es por demas, lee el ejemplo...


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Shell Root en 10 Marzo 2011, 05:06 am
Cual? ahhahaa


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 05:11 am
Cual? ahhahaa

Pues el que esta en el primer post :S daaaaaaaa !


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Shell Root en 10 Marzo 2011, 05:14 am
Con ejemplos reales, me refiero a los datos que están la base de datos. Y explicando lo que quieres extraer... ¬¬!


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 05:25 am
Con ejemplos reales, me refiero a los datos que están la base de datos. Y explicando lo que quieres extraer... ¬¬!

fijate en el script que puse en el primer post, lo que hago es contabilizar las entradas que se publicaron en el MEs y A~O actual, pero es algo pesado cuando ya se tienen MUCHOS DATOS en la bas e:(, vaya, como podria hacerle para directamente en la sentencia MySQL solo consultar los datos que sean del MES y A~O actuales ?

Se puede o no ?

Saludos !


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Shell Root en 10 Marzo 2011, 05:30 am
 La siguiente consulta selecciona todos los registros con un valor date_col dentro de los últimos 30 días:
Código
  1. mysql> SELECT something FROM tbl_name
  2.    -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

:http://dev.mysql.com/doc/refman/5.0/es/date-and-time-functions.html


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 05:37 am
La siguiente consulta selecciona todos los registros con un valor date_col dentro de los últimos 30 días:
Código
  1. mysql> SELECT something FROM tbl_name
  2.    -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

:http://dev.mysql.com/doc/refman/5.0/es/date-and-time-functions.html

Ya estuve leyendo antes eso, pero me pregunto si funcionara cuando la FECHa se guarda tomando el dato de time() ?... Porque en los ejemplos, las consultas son: year-mont-day... Y el formato de time() es un numero decimal largo !


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Nakp en 10 Marzo 2011, 05:47 am
Spara comenzar... el campo FECHA debe ser de tipo DATE en vez de varchar, segundo puedes sacar por año, mes o fecha actual utilizando una condicion en where (en el sql)

Código
  1. SELECT * FROM DATOS WHERE FECHA = CURDATE()

y cuando insertas (si solon necesitas fecha, sin hora) puedes usar la misma funcion en sql, o NOW()

si es por mes o año actual?

Código
  1. SELECT * FROM DATOS WHERE YEAR(FECHA) = YEAR(CURDATE())
  2. SELECT * FROM DATOS WHERE YEAR(FECHA) = 2011

funcionarian exactamente igual :p

Código
  1. SELECT * FROM DATOS WHERE MONTH(FECHA) = MONTH(CURDATE())
  2. SELECT * FROM DATOS WHERE MONTH(FECHA) = 3
  3. ELECT * FROM DATOS WHERE MONTHNAME(FECHA) = 'March'

para marzo xD


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 05:57 am
Spara comenzar... el campo FECHA debe ser de tipo DATE en vez de varchar, segundo puedes sacar por año, mes o fecha actual utilizando una condicion en where (en el sql)

Código
  1. SELECT * FROM DATOS WHERE FECHA = CURDATE()

y cuando insertas (si solon necesitas fecha, sin hora) puedes usar la misma funcion en sql, o NOW()

si es por mes o año actual?

Código
  1. SELECT * FROM DATOS WHERE YEAR(FECHA) = YEAR(CURDATE())
  2. SELECT * FROM DATOS WHERE YEAR(FECHA) = 2011

funcionarian exactamente igual :p

Código
  1. SELECT * FROM DATOS WHERE MONTH(FECHA) = MONTH(CURDATE())
  2. SELECT * FROM DATOS WHERE MONTH(FECHA) = 3
  3. ELECT * FROM DATOS WHERE MONTH(FECHA) = 'March'

para marzo xD

Bueno vamos por partes para tomar todo bien y hacer la implementacion en mi sistema....

Actualmente cuando guardo un registro, lo hago asi:

Código
  1. mysql_query( "inser into DATOS( ID, MENSAJE, FECHA ) values('123', 'abc', '". time(). "');", $link );

Si cambio el campo FECHA VARCJAR(100) NOT NULL a FECHA DATE, tendria problemas con la forma actual de guardar mis datos ?

Saludos !


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Nakp en 10 Marzo 2011, 06:06 am
time() es un timestamp en formato unix... cambia por

Código
  1. mysql_query( "inser into DATOS( ID, MENSAJE, FECHA ) values('123', 'abc', NOW());", $link);
  2.  
  3. //o
  4.  
  5. mysql_query( "inser into DATOS( ID, MENSAJE, FECHA ) values('123', 'abc', CURDATE());", $link);

dependiendo si necesitas el timestamp (fecha y hora) o solo la fecha


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Nakp en 10 Marzo 2011, 07:14 am
La siguiente consulta selecciona todos los registros con un valor date_col dentro de los últimos 30 días:
Código
  1. mysql> SELECT something FROM tbl_name
  2.    -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

:http://dev.mysql.com/doc/refman/5.0/es/date-and-time-functions.html

supon que es febrero :) o diciembre que tiene 31 :O


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Nakp en 10 Marzo 2011, 16:14 pm
jeje despues de pensar un rato puedes seleccionar todas las fechas del mismo mes y año pasando el año y mes concatenados :P para marzo 2011 seria 201103 por lo tanto la query quedaria mas o menos asi

Código
  1. SELECT * FROM DATOS WHERE EXTRACT(YEAR_MONTH FROM FECHA) = 201103;
  2.  
  3. SELECT * FROM DATOS WHERE YEAR(FECHA) = 2011 AND MONTH(FECHA) = 3;

funcionarina exactamente igual para el mismo mes (del mismo año) :P


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 17:57 pm
time() es un timestamp en formato unix... cambia por

Código
  1. mysql_query( "inser into DATOS( ID, MENSAJE, FECHA ) values('123', 'abc', NOW());", $link);
  2.  
  3. //o
  4.  
  5. mysql_query( "inser into DATOS( ID, MENSAJE, FECHA ) values('123', 'abc', CURDATE());", $link);

dependiendo si necesitas el timestamp (fecha y hora) o solo la fecha

Quiero tener en el campo FECHA la disponibilidad de Fecha y Hora, que funcion utilizo ???... NOW() o CURDATE() ?...

Por cierto, la insercion (ya en la realidad) la utilizo mediante una funcion llamada insertar_bdd() pasandole 2 argumentos, el primer argumento es el nombre de la base de datos y el segun argumento es un array donde esta los campos y su valor... Como podria hacer el cambio a la forma de usar NOW() o CURDATE() ?

Asi lo hago ahorita, como lo haria ahora ???

Código
  1. <?php
  2. $trama= array(
  3.     "id"=>"'123'",
  4.     "mensaje"=>"'abc'",
  5.     "fecha"=>"'". time(). "'" );
  6.  
  7. if( !insertar_bdd( "DATOS", $trama ) )
  8.     echo 'Error...';
  9. else     echo 'Exito...';
  10. ?>



Aprovecho para hacer otra observacion... Como actualmente todas mis fechas de las tablas que uso, las guardo usando el tiempo de unix ( time() ) y la variable FECHA es un VARCHAR(100) not NULL... Digamos que sustituyo a FECHA DATE not NULL, pero ahora como se guardaran los datos ?? Ya que actualmente cuando muestro una fecha, despues de hacer la consultar y extraer el campo de FECHA (usando mysql_fetch_array()), imprimo los datos asi:

Código
  1. <?php
  2. $cons= consultar......
  3. $buf= mysql_fetch_array($cons);
  4. echo 'Fecha: '. date( "d/m/Y", $buf["FECHA"] );
  5. echo '<br>Horario: '. date( "g:i a", $buf["FECHA"] );
  6. ?>

Como seria cuando se cambie a FECHA DATE not NULL ?

Cabe mencionar que quiero preguntar antes de hacer pruebas, ya que mi sistema esta ya algo cargado de datos y no quiero experimentar con este, por seguridad y porque no quiero cometer alguna torpesa y da~ar mis registros :D.

Saludos !


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Nakp en 10 Marzo 2011, 20:31 pm
el problema es que guardas un unix timestamp (el cual.. no es varchar, bastaria con un campo numeric o decimal en la base de datos) dependiendo que necesites guardar, en tu base de datos ese campo deberia ser DATE o DATETIME (fecha o fecha y hora)

time() devuelve fecha Y hora en formato unix... pero si no usaras la hora talvez prefieras usar date("Y-m-d") para guardar solo la fecha (y el campo de tipo DATE en la base de datos)

si necesitas la fecha Y hora deberias usar DATETIME en tu base de datos y date("Y-m-d H:m:s") para insertar el timestamp en la base de datos (todo esto del lado de php, las  funciones comentadas anteriormente CURDATE() y NOW() son de SQL)

en resumen xD tendrias que dejar de usar time() y cambiar la forma en que se guardan las fechas en la base de datos, lo cual es una buena practica tomando en cuenta que el tiempo unix empieza el 1 de enero de 1970 a las 0:00 :) imagina si tu sistema guardara fechas de nacimiento :P mi padre no podria registrarse xD


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 21:36 pm
Corrígeme si es necesario....

Entonces seria cambiar el FECHA VARCHAR(100) not NULL, a FECHA DATETIME not NULL.
Despues cambiar el script asi:
Código
  1. <?php
  2. $trama= array(
  3.     "id"=>"'123'",
  4.     "mensaje"=>"'abc'",
  5.     "fecha"=>"'". date( "Y-m-d H:m:s", time()). "'" );
  6. ?>

Ya con eso, seria convinar las funciones NOW() y CURDATE() (ambas de SQL) para las busquedas segun los lapsos que deseo !.

Pero respecto ya a la practica de bsuqueda, no importa que quiera buscar en FECHA por ejemplo la fecha: 2011-01-01, asumiendo que el campo tiene el formato Y-m-d H:m:s, el MySQL excluira los valores H:m:s para hacer la busqueda con lo que concuerde con 2011-01-01 ?

Saludos !


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Nakp en 10 Marzo 2011, 22:27 pm
no es necesario pasar el segundo parametro a date (quita ese time())

despues para buscar por lapsos de tiempo puedes usar esto (https://foro.elhacker.net/php/mysql_consultar_mediante_rango_de_fechas_en_una_sola_sentencias-t321474.0.html;msg1589546#msg1589546)

y por ultimo, si... si buscas solo con la fecha mysql obvia la hora ;)


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 22:34 pm
no es necesario pasar el segundo parametro a date (quita ese time())

Entonces como se pasa la fecha ?


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Nakp en 10 Marzo 2011, 22:53 pm
date("Y-m-d H:m:s") devuelve la fecha y hora actual :) el segundo es solo para darle formato a otra hora, seria redundante pasarle time()


Título: Re: [mysql] Consultar mediante rango de fechas en una sola sentencias ?
Publicado por: Diabliyo en 10 Marzo 2011, 22:57 pm
date("Y-m-d H:m:s") devuelve la fecha y hora actual :) el segundo es solo para darle formato a otra hora, seria redundante pasarle time()

echo, deja hago los cambios y pongo AQUI cualquier otro problema con las fechas, sirve que no se pierde el hilo xD