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

Comparar fechas por rango

Estas en el tema de Comparar fechas por rango en el foro de SQL Server en Foros del Web. Hola, que tal? Después de buscar en el foro, no he podido hacer lo siguiente, y no sé si existe una forma mejor, pero aqui ...
  #1 (permalink)  
Antiguo 15/07/2011, 09:55
Avatar de eliza_ralves  
Fecha de Ingreso: junio-2009
Ubicación: Caracas
Mensajes: 126
Antigüedad: 14 años, 10 meses
Puntos: 2
Exclamación Comparar fechas por rango

Hola, que tal? Después de buscar en el foro, no he podido hacer lo siguiente, y no sé si existe una forma mejor, pero aqui les va:

en una consulta tengo el año y el mes correspondiente a la semana de una fecha

dd/mm/yyyy --> resultado de la tabla es:

Año Mes

2014 06
2016 05


estoy tratando de filtrar de la siguiente manera:

$mesI = substr("$fechaInicioAux", 4, 2);
$anioI = substr("$fechaInicioAux", 8, 5);

$mesF = substr("$fechaFinalAux", 4, 2);
$anioF = substr("$fechaFinalAux", 8, 5);

Y en la consulta:

AND P.Ano_Semana BETWEEN '" . $anioI . "' AND '" . $anioF . "'
AND P.Mes_Semana BETWEEN '" . $mesI . "' AND '" . $mesF . "'

La cuestión es que no sé cómo hacer para que me tome el rango, es decir, que el año de la fecha de inicio corresponda con dicho mes HASTA el año de la fecha final con su correspondiente mes.

Si lo coloco como lo pongo arriba, sólo me va a devolver sólo los registros que esten en el rango de los años pero sólo en el rango de meses.... y no los intermedios.

No sé si me explique.

Espero que alguien me pueda ayudar!


EDIT:

tengo estos registros

Año Mes
2014 11
2014 12
2015 1
2015 2
2015 3
2015 4
2015 5
2015 6
2015 7
2015 8
2015 9
2015 10
2015 11
2015 12
2016 1
2016 2
2016 3
2016 4
2016 5

si hago lo siguiente :

AND P.Ano_Semana BETWEEN '2014' AND '2016'
AND P.Mes_Semana BETWEEN '5' AND '8'

Me devuelve:

Año Mes

2014 6
2014 7
2014 8
2015 5
2015 6
2015 7
2015 8
2016 5
2016 6

y lo que quiero hacer es que me envíe todos los registros desde 2014 - 05 (incluyendo) hasta 2016-08 (incluyendo)
__________________
“El mayor enemigo del conocimiento no es la ignorancia, sino la ilusión del conocimiento”— Stephen Hawking

Última edición por eliza_ralves; 15/07/2011 a las 10:01 Razón: Detallar la consulta
  #2 (permalink)  
Antiguo 15/07/2011, 10:36
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Comparar fechas por rango

No te sirve de esta manera:

Código SQL:
Ver original
  1. CREATE TABLE #temp(año INT,mes INT, dia VARCHAR(10))
  2. INSERT INTO #temp (año,mes,dia) VALUES (2014,11,'01')
  3. INSERT INTO #temp (año,mes,dia) VALUES (2012,12,'01')
  4. INSERT INTO #temp (año,mes,dia) VALUES (2015,1,'01')
  5. INSERT INTO #temp (año,mes,dia) VALUES (2015,2,'01')
  6. INSERT INTO #temp (año,mes,dia) VALUES (2015,3,'01')
  7. INSERT INTO #temp (año,mes,dia) VALUES (2015,4,'01')
  8. INSERT INTO #temp (año,mes,dia) VALUES (2015,5,'01')
  9. INSERT INTO #temp (año,mes,dia) VALUES (2015,6,'01')
  10. INSERT INTO #temp (año,mes,dia) VALUES (2015,7,'01')
  11. INSERT INTO #temp (año,mes,dia) VALUES (2015,8,'01')
  12. INSERT INTO #temp (año,mes,dia) VALUES (2015,9,'01')
  13. INSERT INTO #temp (año,mes,dia) VALUES (2015,10,'01')
  14. INSERT INTO #temp (año,mes,dia) VALUES (2015,11,'01')
  15. INSERT INTO #temp (año,mes,dia) VALUES (2015,12,'01')
  16. INSERT INTO #temp (año,mes,dia) VALUES (2016,1,'01')
  17. INSERT INTO #temp (año,mes,dia) VALUES (2016,2,'01')
  18. INSERT INTO #temp (año,mes,dia) VALUES (2016,3,'01')
  19. INSERT INTO #temp (año,mes,dia) VALUES (2016,4,'01')
  20. INSERT INTO #temp (año,mes,dia) VALUES (2016,5,'01')
  21.  
  22.  
  23. SELECT * FROM(
  24. SELECT CONVERT(datetime,(CONVERT(VARCHAR(10),año) + '-' + CONVERT(VARCHAR(10),mes) + '-' + dia )) AS fecha FROM #temp
  25. ) t1 WHERE fecha BETWEEN '2014-05-01' AND '2016-08-01'

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 18/07/2011, 06:22
Avatar de eliza_ralves  
Fecha de Ingreso: junio-2009
Ubicación: Caracas
Mensajes: 126
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Comparar fechas por rango

Hola Libras! No, porque como hago un tratamiento especial para que de acuerdo al año y mes me tome el rango..... como me lo propones es comparar la fecha completa, pero en mi caso, tomo de las fechas el año y el mes correspondiente a la semana, para luego comparar el año y mes de la correspondiente a dicha semana y sacar el rango.

No se si me explique.

Lamento la tardanza.

Abajo hago el tratamiento con una función:

function calcularHoras($tipo_grafico, $dis_select, $ofic_select, $fechaInicioAux, $fechaFinalAux){

// para fecha inicial
$semanaInicial = obtenerNumSemana($fechaInicioAux);
$mesInicial = obtenerNumMes($fechaInicioAux);
$anualInicio = obtenerNumeroAnual($fechaInicioAux);

if($semanaInicial == 1 && $mesInicial == 12)

$anualInicioAux = $anualInicio + 1;

else if(($semanaInicial == 52 || $semanaInicial == 53) && $mesInicial == 1)

$anualInicioAux = $anualInicio - 1;

else

$anualInicioAux = $anualInicio;

$mesActual = obtenerNumMesDeSemana($semanaInicial, $anualInicioAux);

// para fecha final
$semanaFinal = obtenerNumSemana($fechaFinalAux);
$mesFinal = obtenerNumMes($fechaFinalAux);
$anualFinal = obtenerNumeroAnual($fechaFinalAux);

if($semanaFinal == 1 && $mesFinal == 12)

$anualFinalAux = $anualFinal + 1;

else if($semanaFinal == 52 && $mesFinal == 1)

$anualFinalAux = $anualFinal - 1;

else

$anualFinalAux = $anualFinal;

$mesFinalAux = obtenerNumMesDeSemana($semanaFinal, $anualFinalAux);

$query = "SELECT Ano_Semana, Mes_Semana, SUM(P.Cantidad_Horas) AS Horas
FROM SPO2_Participa P
WHERE

P.Fecha_Inicio BETWEEN

(
(P.Ano_Semana >= '" . $anualInicioAux . "')
AND (P.Mes_Semana >= '" .$mesActual . "')
)
AND
(
(P.Ano_Semana <= '" . $anualFinalAux . "')
AND (P.Mes_Semana <= '" .$mesFinalAux . "')
)
)

GROUP BY Ano_Semana, Mes_Semana
ORDER BY Ano_Semana, Mes_Semana";
__________________
“El mayor enemigo del conocimiento no es la ignorancia, sino la ilusión del conocimiento”— Stephen Hawking

Última edición por eliza_ralves; 18/07/2011 a las 06:26 Razón: Adición de la función para el tratamiento de las fechas
  #4 (permalink)  
Antiguo 18/07/2011, 07:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Comparar fechas por rango

Si nada mas comparas el año y el mes, entonces donde esta el problema en que uses la fecha completa? digo 01/01=01/01/01 no??

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 20/07/2011, 06:57
Avatar de eliza_ralves  
Fecha de Ingreso: junio-2009
Ubicación: Caracas
Mensajes: 126
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Comparar fechas por rango

Gracias Libras por el interés en la ayuda!

Pero a partir de lo que me dices pude transformarlo a lo que necesitaba, de la siguiente forma en el query:

AND (
(P.Ano_Semana > '" . $anualInicioAux . "' )
OR ((P.Ano_Semana = '" . $anualInicioAux . "') AND (P.Mes_Semana >= '" . $mesActual . "'))
)
AND (
(P.Ano_Semana < '" . $anualFinalAux . "' )
OR ((P.Ano_Semana = '" . $anualFinalAux . "') AND (P.Mes_Semana <= '" . $mesFinalAux ."'))
)

De esta forma comparo el rango entre los valores que están en el medio y los casos borde.



Gracias!
__________________
“El mayor enemigo del conocimiento no es la ignorancia, sino la ilusión del conocimiento”— Stephen Hawking

Etiquetas: fechas, rango, registros, tabla
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 02:09.