SQL - estudiante

   
Vista:

estudiante

Publicado por alvaro alv_8@hotmail.com (4 intervenciones) el 16/02/2012 17:02:46
Mi duda es la siguiente :

Puedo tomar la diferencia en horas entre dos fechas, pero filtrandolas en un rango de horario predefinido.

ejemplo datadiff(hh,fecha1,fecha2(solo el horario entre 8:00am y 5pm))

existe un forma para hacer eso en sql server 2008, si no como podria hacerlo??



De Antemano les agradezco cualquier aporte que me puedan brindar.
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

estudiante

Publicado por leonardo_josue (878 intervenciones) el 17/02/2012 17:09:51
Hola alvaro:

No me queda claro qué es lo que necesitas, tal vez deberías poner algunos datos de ejemplo y decirnos qué esperas de salida, para poder ver cómo plantear el problema, sin embargo por lo poco que pude deducir de lo que pones, al ser dos condiciones las que quieres manejar, puedes hacerlo con un AND, es decir, algo como esto:

ejemplo

1
2
3
WHERE
la hora de la fecha2 esté entre 8:00am y 5pm AND
la datediff(hh,fecha1,fecha2) sea la que necesites


Recuerda que el operador AND hace que se tengan que cumplir todas las condiciones, por lo tanto, si las fecha2 no está dentro de las horas deseadas entonces no se evalua la diferencia.

Si esto no te sirve te repito, pon algunos datos de ejemplo para que quede más claro el problema

Saludos
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

estudiante

Publicado por alvaro (4 intervenciones) el 17/02/2012 21:11:56
Muchas Gracias por la rspuesta, pero no es lo que nesecito voy a poner un ejemplo para hacerme entender mejor

tengo dos fechas

fecha 1 = 2012-02-03 7:04:00.000
fecha 2 =2012-02-18 19:04:00.000


si saco la diferencia en horas con un datadiff(h,fecha1,fecha2), me darian 372 horas, lo que nesecito es que no me contabilice todas las horas entre esos dos dias,sino solo las horas entre esas fechas que esten entre las 8:00 y las 17:00.


Te reitero las gracias por haberte tomado el trabajo de analisar mi duda.
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

estudiante

Publicado por leonardo_josue (878 intervenciones) el 17/02/2012 23:11:27
Hola de nuevo alvaro... tu problema no es tan trivial, pero tampoco tan difícil... te explico la lógica se me ocurrió para resolver tu problema:

Lo primero que pensé fue simplemente en obtener la diferencia en días entre las dos fechas y multiplicarla por 9 (qué es el número de horas entre las 8:00 y las 17:00, pero existe un problema y es que la fecha inicial puede comenzar después de las 8:00, por lo tanto debería tomar sólo las horas que le corresponden de ese día... lo mismo ocurre con la fecha de fin, si ocurre antes de las 17:00 entonces no se deben contabilizar las 9 horas para ese día, sino la fracción correspondiente. La solución que se me ocurrió entonces es restar al total de horas "completas" las horas que no se deben considerar tanto del primer día, como del último (si fuera el caso). Veamos un ejemplo. Supongamos que tus fechas son las siguientes:

1
2
3
4
declare @fecha1 datetime
declare @fecha2 datetime
set @fecha1 = '2012-02-03 09:04:00.000'
set @fecha2 = '2012-02-04 13:04:00.000'


es decir comienzan después de las 8:00 pero terminan antes de las 17:00 del siguiente día.

La lógica que seguí fue lo siguiente.

Primero, Obtener el número de días entre las fechas + 1 y multiplicarlo * 9 (es decir esto):

1
2
select (datediff(dd, @fecha1, @fecha2) + 1) * 9
--> 18



ahora bien, para obtener el número de horas que se tendrían que restar del primer día podrías hacerlo asi:

1
2
3
4
set @fechaini = '2012-02-03 08:00:00.000' -->Misma fecha que fecha1, pero a las 8:00
select
case when (@fecha1 > @fechaini) then datediff(hh, @fechaini, @fecha1) else 0 end
--> 1


Esto quiere decir que la fecha de inicio comenzó una hora después de las 8:00 por lo tanto se tiene que restar 1 hora al resultado inicial. La misma lógica se seguiría para la fecha final:

1
2
3
4
set @fechafin = '2012-02-04 17:00:00.000'
select
case when (@fecha2 < @fechafin) then datediff(hh, @fecha2, @fechafin) else 0 end
-->4


es decir, la fecha de fin concluyó 4 horas antes de las 15:00. observa que en ambos casos, el valor else es 0, es decir, si la fecha inicial es antes de las 8 y/o la final de después de las 15 hrs entonces no se tiene que restar nada

Ahora sí, para obtener el resultado final simplemente tendías que aplicar la siguiente fórmula:

primer resultado - segundo resultado - tercer resultado

o lo que es lo mismo

1
2
3
4
5
6
7
8
9
10
11
18 horas totales
- 1 hora que no se considera del primer día
- 4 horas que no se consideran del segundo día
________
= 13 horas
 
haciendo el cálculo con las fechas serían:
8 horas del primer día: de las 9:00 a las 17:00
5 horas del segundo día: de las 8:00
__________
= 13 horas


Esto podrías hacerlo por parte o en una sola consulta. Te toca hacer la fórmula para obtener de manera dinámica la fechaini y fechafin. Dale un vistazo y cualquier duda la comentas en el foro.

Saludos
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

estudiante

Publicado por ALVARO (4 intervenciones) el 18/02/2012 19:13:56
Buenos dias,

Muchas Gracias

me parece muy acertada la propuesta , asi que voy a probar tu logica, pienso ensamblarla en un funcion para hacerlo mas dinamico.

Una vez termine te cuento como me fue .
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

estudiante

Publicado por alvaro (4 intervenciones) el 21/02/2012 16:20:25
Bunos aca esta la solucion a mi problema gracias a la ayuda del foro, adicione una funcion de la web para sacar solo dias habiles se llama difdias la encuentran buscando por el nombre de la funcion en google.

create FUNCTION [dbo].[Ans](@fechainicial DATETIME,@fechafinal DATETIME)
RETURNS integer
AS

BEGIN
-- Declare the return variable here

declare @fechafinjornada as datetime
declare @fechainiciojornada as datetime
declare @respuesta as int
declare @horasmedias as int



set @fechainiciojornada = CAST(YEAR(@fechainicial) AS VARCHAR(4)) + '-' +
CAST(MONTH(@fechainicial) AS VARCHAR(2)) + '-' +
CAST(DAY(@fechainicial) AS VARCHAR(2)) + ' 08:00:00.000'

set @fechafinjornada= CAST(YEAR(@fechafinal) AS VARCHAR(4)) + '-' +
CAST(MONTH(@fechafinal) AS VARCHAR(2)) + '-' +
CAST(DAY(@fechafinal) AS VARCHAR(2)) + ' 17:00:00.000'


declare @horas1 as integer
declare @horas2 as integer


select @horas1 = case

when (@fechainicial > @fechainiciojornada)
then datediff(hh,@fechainiciojornada, @fechainicial )
else 0
end


select @horas2 = case
when ( @fechafinal < @fechafinjornada )

then datediff(hh,@fechafinal,@fechafinjornada)
else 0
end


select @horasmedias=(dbo.DifDias(@fechainicial,@fechafinal)*12)-@horas1-@horas2


RETURN @horasmedias

END
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