[mysql] Consultar mediante rango de fechas en una sola sentencias ?

Iniciado por Diabliyo, 10 Marzo 2011, 04:17 AM

0 Miembros y 3 Visitantes están viendo este tema.

Diabliyo

Cita de: 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 (sql) [Seleccionar]
mysql> SELECT something FROM tbl_name
    -> 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 !

Nakp

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 (sql) [Seleccionar]
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 (sql) [Seleccionar]
SELECT * FROM DATOS WHERE YEAR(FECHA) = YEAR(CURDATE())
SELECT * FROM DATOS WHERE YEAR(FECHA) = 2011


funcionarian exactamente igual :p

Código (sql) [Seleccionar]
SELECT * FROM DATOS WHERE MONTH(FECHA) = MONTH(CURDATE())
SELECT * FROM DATOS WHERE MONTH(FECHA) = 3
ELECT * FROM DATOS WHERE MONTHNAME(FECHA) = 'March'


para marzo xD
Ojo por ojo, y el mundo acabará ciego.

Diabliyo

Cita de: 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 (sql) [Seleccionar]
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 (sql) [Seleccionar]
SELECT * FROM DATOS WHERE YEAR(FECHA) = YEAR(CURDATE())
SELECT * FROM DATOS WHERE YEAR(FECHA) = 2011


funcionarian exactamente igual :p

Código (sql) [Seleccionar]
SELECT * FROM DATOS WHERE MONTH(FECHA) = MONTH(CURDATE())
SELECT * FROM DATOS WHERE MONTH(FECHA) = 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 (php) [Seleccionar]
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 !

Nakp

time() es un timestamp en formato unix... cambia por

Código (php) [Seleccionar]
mysql_query( "inser into DATOS( ID, MENSAJE, FECHA ) values('123', 'abc', NOW());", $link);

//o

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
Ojo por ojo, y el mundo acabará ciego.

Nakp

Cita de: 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 (sql) [Seleccionar]
mysql> SELECT something FROM tbl_name
    -> 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
Ojo por ojo, y el mundo acabará ciego.

Nakp

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 (sql) [Seleccionar]
SELECT * FROM DATOS WHERE EXTRACT(YEAR_MONTH FROM FECHA) = 201103;

SELECT * FROM DATOS WHERE YEAR(FECHA) = 2011 AND MONTH(FECHA) = 3;


funcionarina exactamente igual para el mismo mes (del mismo año) :P
Ojo por ojo, y el mundo acabará ciego.

Diabliyo

Cita de: Nakp en 10 Marzo 2011, 06:06 AM
time() es un timestamp en formato unix... cambia por

Código (php) [Seleccionar]
mysql_query( "inser into DATOS( ID, MENSAJE, FECHA ) values('123', 'abc', NOW());", $link);

//o

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 (php) [Seleccionar]
<?php
$trama
= array(
     
"id"=>"'123'",
     
"mensaje"=>"'abc'"
     
"fecha"=>"'"time(). "'" );

if( !
insertar_bdd"DATOS"$trama ) )
     echo 
'Error...';
else     echo 
'Exito...';
?>





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 (php) [Seleccionar]
<?php
$cons
consultar......
$bufmysql_fetch_array($cons);
echo 
'Fecha: 'date"d/m/Y"$buf["FECHA"] );
echo 
'<br>Horario: 'date"g:i a"$buf["FECHA"] );
?>


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 !

Nakp

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
Ojo por ojo, y el mundo acabará ciego.

Diabliyo

#18
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 (php) [Seleccionar]
<?php
$trama
= array(
     
"id"=>"'123'",
     
"mensaje"=>"'abc'"
     
"fecha"=>"'"date"Y-m-d H:m:s"time()). "'" );
?>


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 !

Nakp

no es necesario pasar el segundo parametro a date (quita ese time())

despues para buscar por lapsos de tiempo puedes usar esto

y por ultimo, si... si buscas solo con la fecha mysql obvia la hora ;)
Ojo por ojo, y el mundo acabará ciego.