SQL - Búsqueda entre fechas

   
Vista:

Búsqueda entre fechas

Publicado por zutanito (3 intervenciones) el 27/05/2010 00:48:27
Hola a todos (as)... la verdad soy MUY principiante en este tema y tengo un problema con una búsqueda de datos entre dos fechas (por ejemplo del 01/04/2010 al 30/04/2010), mejor dicho tengo que extraer la información para un mes completo en específico.

Inicialmente tengo este query:

SELECT count (a.c_ending_status), a.c_ending_status FROM see_invocation_view a where (to_date('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI SS')+(a.n_submission_date/(1000*24*60*60)))>to_date('01/MAY/2010 00:00:00', 'dd/MON/yy hh24:mi ss') and a.c_invoker_id = 'AutomaticTransaction' group by a.c_ending_status;

He intentado modificarlo usando un "Between" o definiendo los rangos entre un "mayor que" (>) y un "menor que" (<) sin éxito. Me salen errores de sintaxis o después de un buen rato me dice "No rows selected"

De antemano MIL GRACIAS por la ayuda!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Búsqueda entre fechas

Publicado por Leonardo Josue (877 intervenciones) el 28/05/2010 16:55:18
Buenos días Zutanito...

La verdad no le entendí mucho a tu consulta, así es que comencemos por partes.

En primer lugar no mencionas que manejador de base de datos estás utilizando. La sintaxis para el manejo de las fechas entre los manejadores de BD es varía mucho. voy a suponer que se trata de ORACLE, si no es así te pido que menciones qué manejador utilizas para tratar de ayudarte.

Te pongo dos ejemplos en ORACLE de cómo obtener los registros donde un campo tipo fecha se encuentre dentro de un mes en específico (mayo de 2010)
el primero es utilizando la función between y el segundo es obteniendo el mes y el año específicos y comparandolos. Ambas consultas regresan el mismo resultado.

CON BETWEEN:

select * from tabla
where
to_date(to_char(fecha, 'dd/mm/yyyy'), 'dd/mm/yyyy') between to_date('01/05/2010', 'dd/mm/yyyy)') and to_date('31/05/2010', 'dd/mm/yyyy)')
order by fecha

OBTENIENDO EL MES Y EL AÑO

select * from tabla
where
to_char(fecha, 'mm') = '05' and
to_char(fecha, 'yyyy') = '2010'
order by fecha

Si observas en el primer ejemplo tengo lo siguiente to_date(to_char(fecha, 'dd/mm/yyyy'), 'dd/mm/yyyy'). Esto es porque los campos tipo fecha almacenan también la hora y minuto. por lo tanto hay que truncar este dato para dejar sólo el día, mes y año que quieres comparar.

Saludos y espero tus comentarios.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Búsqueda entre fechas

Publicado por zutanito (3 intervenciones) el 03/06/2010 15:07:46
Hola Leonardo! No te había respondido antes porque he estado dándole otras mil vueltas al tema sin éxito =(

Tengo algunas preguntas:

1. El parámetro "Fecha" corresponde con el nombre del campo donde almaceno la fecha cierto? En mi caso este vendría siendo "n_submission_date"

2. En el query inicial que debo modificar, al nombre de cada campo de la tabla le han agregado un "a.", por ejemplo: "a.n_submission_date" ¿podrías explicarme para qué se emplea "a."?

Este es el query que me enviaste con las modificaciones que le hice para adaptarlo con los nombres de mis tablas/campos:

SELECT count (a.c_ending_status), a.c_ending_status FROM see_invocation_view a WHERE to_date(to_char(a.n_submission_date, 'dd/mm/yyyy'), 'dd/mm/yyyy') BETWEEN to_date('01/05/2010', 'dd/mm/yyyy)') and to_date('31/05/2010', 'dd/mm/yyyy)') ORDER BY a.n_submission_date

Nuevamente mil gracias por tu ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Búsqueda entre fechas

Publicado por Leonardo Josue (877 intervenciones) el 03/06/2010 16:26:11
Buenos días zutanito:

En el post que puse anteriormente te pedía que especificaras qué manejador de bd estás utilizando para ver si la sintaxis que puse es válida para dicho manejador, pero en tu nuevo post sigues sin mencionar con qué manejador estás trabajando.

En cuanto a sus preguntas,

1. Efectivamente, "fecha" es el nombre del campo donde tienes almacenado la fecha que quieres analizar.

2. A es un alias para la tabla (see_invocation_view en este caso). Si analizas un poco la consulta te encontrarás con lo siguiente

FROM see_invocation_view a

Esto quiere decir que en lugar de tener que poner todo el nombre de la tabla pueses utilizar el alias "a"

Otra cosa... en este post mencionas que le haz estado dándole otras mil vueltas al tema sin éxito, pero nunca mencionas qué es lo que falla... ¿la consulta te marca algún error? ¿qué error te marca? ¿los resultados obtenidos no son los resultados esperados? ¿qué obtienes o qué esperarías obtener?

Finalmente, en mi post te puse DOS alternativas para poder solucionar tu problema. ¿Probaste ambas soluciones y en ambas tuviste problemas?

Saludos y espero tus comentarios.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Búsqueda entre fechas

Publicado por zutanito (3 intervenciones) el 03/06/2010 16:35:21
Hola sí, qué pena por lo del manejador pensé que ya te lo había confirmado... efectivamente es ORACLE.

La falla es que se queda "pensando" un rato y al final no saca ningún dato. El resultado es el mismo con las dos opciones que pusiste.

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Búsqueda entre fechas

Publicado por Leonardo Josue (877 intervenciones) el 03/06/2010 17:06:46
La consulta es completamente válida para ORACLE... hice la siguiente prueba y funcionó correctamente:

/*Para crear una tabla con datos aleatorios*/
create table see_invocation_view as
select to_date('01/05/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('11/03/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('22/04/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('21/03/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('30/01/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('08/05/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('15/06/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('27/07/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('02/03/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('10/01/2010', 'dd/mm/yyyy') as n_submission_date from dual union
select to_date('13/02/2010', 'dd/mm/yyyy') as n_submission_date from dual;

/*Para hacer la consulta de los datos*/
SELECT a.n_submission_date FROM see_invocation_view a
WHERE
to_date(to_char(a.n_submission_date, 'dd/mm/yyyy'), 'dd/mm/yyyy')
BETWEEN
to_date('01/05/2010', 'dd/mm/yyyy)') and
to_date('31/05/2010', 'dd/mm/yyyy)')
ORDER BY a.n_submission_date;

/*Utilizando la segunda solución*/
SELECT a.n_submission_date FROM see_invocation_view a
WHERE
to_char(a.n_submission_date, 'mm') = '05' and
to_char(a.n_submission_date, 'yyyy') = '2010'
order by a.n_submission_date

Para ambos casos el resultado que obtengo es:

N_SUBMISSION_DATE
-------------------------
01/05/10
08/05/10

NOTA: la fecha se muestra sin formato.

Revisando un poco la consulta que quieres ejecutar, creo que hace falta que especifiques por qué campo(s) se tiene que agrupar la información, ya que estás utilizando una función de agregación (count (a.c_ending_status)). Revisa bien esta consulta antes de expecificar el filtro de fechas. El otro problema que se me ocurre sería que efectivamente no existan registros para este rango de fechas,

Suerte con tus pruebas.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar