SQL Server - Como crear un Ciclo en sql

 
Vista:
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 06/04/2017 17:42:25
Hola
Estoy tratando de obtener los días de descanso partiendo de una fecha de Jornada inicial en mi base de datos.
Les comento un empleado tiene la Jornada 8x2 que es 8 días Laborales y 2 de descanso si en mi base de datos tengo que inicio a laborar el 1 de Marzo y yo quiero obtener los días que descanso del 1 de abril al 30 de abril y los días que laboro tomando en cuenta que el inicio su labor desde el 1 de marzo.

como puedo obtener los días laborado y descansados del mes de abril.

Tengo el siguiente código en mi query:
1
2
3
4
5
6
7
8
9
10
11
12
(@NumOperador INT,
@FechaDesde DATETIME,
@FechaHasta DATETIME
)
AS
BEGIN
declare @diadescanso int
Select @diadescanso=CASE  WHEN DATEDIFF (DD  , Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin)
 
END
FROM CopCalendario
WHERE NumOperador=@NumOperador

con esto solo obtengo los días que descanso solo una vez no todos los días que descanso en el mes de abril

espero me pueda ayudar.
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 06/04/2017 19:04:15
Dentro de un bucle (While, Cursor etc) deberias de guardar la informacion en una tabla temporal y despues consultar el resultado,
anexo tambien deberias de tener declaradas las fechas inicio y fin por semana para que esl calculo sea rapido

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Declare @fechainicio,@FechaFin datetime
Set @FechaInicio='20170301'
Set @fechafin= Dateadd(dd,7,@fechainicio)
 
Create table #tmp 
(
Descanso datetime
)
 
 
While (Condiciones)
begin
 
Select @diadescanso=CASE WHEN DATEDIFF (DD , Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin)
 
END
FROM CopCalendario
WHERE NumOperador=@NumOperador
 
Set @fechainicio=DATEADD(dd,7,@fechainicio)
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 06/04/2017 22:49:47
gracias por responder,
he realizado lo que me indicas de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(@NumOperador INT,
@FechaDesde DATETIME,
@FechaHasta DATETIME
)
AS
BEGIN
DECLARE @diadescanso INT, @Descanso DATETIME
Create table #TempPlanTrabajo 
(
Descanso datetime
)
While (@FechaDesde <=@FechaHasta)
begin
Select @diadescanso=CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=@NumOperador
Set @FechaDesde=DATEADD(dd,7,@FechaHasta)
end

pero no me regresa nada :S
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 06/04/2017 23:23:39
despues del while, coloca

Select * from #TempPlanTrabajo

DROP table #TempPlanTrabajo
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 06/04/2017 23:42:50
Me indica el siguiente error:
Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query.

pantalla-2
pantalla

adjunto las imagenes de como coloque el Código me indicas si lo hice de forma correcta o estoy equivocada por favor
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 06/04/2017 23:58:08
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DECLARE @diadescanso INT,
		@Descanso DATETIME
 
--Eliminamos la tabla temporal existente
If OBJECT_ID('tempdb..#TempPlanTrabajo') Is Not Null drop table #TempPlanTrabajo
 
 
Create table #TempPlanTrabajo 
(
Descanso int --captura un total de dias y no fechas
)
 
 
 
 
While (@FechaDesde <=@FechaHasta)
begin
 
Select @diadescanso=CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=@NumOperador
 
Set @FechaDesde=DATEADD(dd,7,@FechaHasta)
end
 
-- aqui va el selector de la tabla temporal
 
Select * from #TempPlanTrabajo
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 07/04/2017 00:07:26
una disculpa pase por alto el insert a la tabla

1
2
3
4
5
6
7
8
9
10
11
12
13
While (@FechaDesde <=@FechaHasta)
begin
 
Select @diadescanso=CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=@NumOperador
 
--Insertamos el resultado obtenido
insert into #TempPlanTrabajo(Descanso) values(@diadescanso)
 
Set @FechaDesde=DATEADD(dd,7,@FechaHasta);
 
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 12/04/2017 22:26:25
Hola Jose,
pues con la noticia que no lo he logrado :S
Hasta el momento coloque el código como me lo indicaste, pero me marca error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE @diadescanso int, @Descanso datetime, @FechaDesde datetime, @FechaHasta datetime
set @FechaDesde='2015-04-01 00:00:00.000'
set @FechaHasta='2015-04-30 00:00:00.000'
If OBJECT_ID('#TempPlanTrabajo') Is Not Null drop table #TempPlanTrabajo
Create table #TempPlanTrabajo 
(Descanso int)
While @FechaDesde <= @FechaHasta
begin
Select @diadescanso=CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=451073
insert into #TempPlanTrabajo(Descanso) values(@diadescanso) 
Set @FechaDesde=DATEADD(dd,7,@FechaHasta)
end

modifique un poco las variables de int a datetime pero me continua marcando error
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 13/04/2017 00:17:22
te anexo ejemplo que tome del tuyo este me da resultados

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE @diadescanso int, @Descanso datetime, @FechaDesde datetime, @FechaHasta datetime
set @FechaDesde='20150401'
set @FechaHasta='20150430'
If OBJECT_ID('tempdb..#TempPlanTrabajo') Is Not Null drop table #TempPlanTrabajo 
Create table #TempPlanTrabajo 
(Descanso char(10))
 
While @FechaDesde <= @FechaHasta
begin
 
SET @diadescanso=(
Select @diadescanso=CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=451073
)
 
insert into #TempPlanTrabajo(Descanso) values(@diadescanso) 
Set @FechaDesde=DATEADD(dd,7,@FechaDesde)
 
end
 
 
Select * from #TempPlanTrabajo


----------------------------------------
Descanso
30
23
16
9
2
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 13/04/2017 00:32:35
SQL

Gracias Jose por continuar con el apoyo...
Sabes me indica error al tiempo de ejecutarlo adjunto la pantalla
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 13/04/2017 00:45:51
no coloques el @diadescanso dentro del set, ese lo deje fuera para que tomara el resultado de la consulta

SET @diadescanso=(consulta)
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 13/04/2017 00:58:37
lo he dejado de la siguiente manera:

1
2
3
4
5
SET @diadescanso=(
Select CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin+1 ) = 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=451073
)

y me indica los siguiente:
Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query.
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 13/04/2017 15:23:33
tienes algun ejemplo de la informacion que tomas de la tabla CopCalendario como ejemplo para ver como la obtienes, ya que no es normal que marque error si los campos estan correctos.



saludos

pd si tienes skype nos conectamos y resolvemos el problema juntos en tu bd.
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 13/04/2017 16:44:04
Hola Jose!!
Muchas gracias por el seguimiento, te comparto la información del empleado 900200 que tengo en la tabla:
Te comento que modifique la información de las fechas ya que yo te había mandado un con fechas del 2015 y actualice la información al 2017 por tal motivo veras el cambio en la imagen.

Los registros que tiene el Empleado en su Jornada Inicia y Jornada Final pues siempre sera la misa ya que tiene una Jornada de 2x1 trabaja 2 días y descansa 1 inicia el 8 de marzo y finaliza el 9 porque ahí van sus 2 días y el siguiente sería día de descanso que seria el día 10.

Están también CveIncidencia la Fecha de inicio y Fecha final de Incidencia, esta es cuando se tiene algún tipo de falta, permiso o algun otro detalle por el cual no asista a trabajar, te explico la tabla para que me entiendas mejor.

Lo que quiero hacer es obtener los días que esta laborando y descansando el empleado 900200 partiendo de su Jornada de inicio, pero tomando en cuenta la @fechadesde y @fechahasta.


El código pues me continua marcando error :S

PD: Tengo correo con chat solamente no se si de esta manera me puedas ayudar también.



tabla-copcalendario
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
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por jose manuel (23 intervenciones) el 15/04/2017 01:48:41
lo que pasa es que estas pidiendo recibir una fecha y no una cantidad de dias error mio al no percatarme de ello te anexo la correccion del codigo este ya funciona con la fecha que solicitas



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
DECLARE @diadescanso datetime, @Descanso datetime, @FechaDesde datetime, @FechaHasta datetime
set @FechaDesde='20170301'
set @FechaHasta='20170430'
 
If OBJECT_ID('tempdb..#TempPlanTrabajo') Is Not Null drop table #TempPlanTrabajo 
 
Create table #TempPlanTrabajo 
(Descanso datetime)
 
Print 'inicio'
 
While @FechaDesde <= @FechaHasta
begin
 
 
 
SET @diadescanso=(
Select top 1
CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin ) >= 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM @CopCalendario
WHERE NumOperador=90200
)
 
--Print @diadescanso
 
insert into #TempPlanTrabajo(Descanso) values(@diadescanso) 
Set @FechaDesde=DATEADD(dd,7,@FechaDesde)
 
end
 
 
Select * from #TempPlanTrabajo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Como crear un Ciclo en sql

Publicado por Molitaa (16 intervenciones) el 17/04/2017 22:12:31
Hola Jose, gracias por tu apoyo,
modifique un poco para lo de la Jornada 2x1
DECLARE @diadescanso datetime, @Descanso datetime, @FechaDesde datetime, @FechaHasta datetime, @TotalDescanso int
SET @FechaDesde='2017-03-08 00:00:00.000'
SET @FechaHasta='2017-03-31 00:00:00.000'
IF OBJECT_ID('tempdb..#TempPlanTrabajo') Is Not Null DROP TABLE #TempPlanTrabajo
CREATE TABLE #TempPlanTrabajo
(Descanso datetime)
Print 'inicio'
WHILE @FechaDesde <= @FechaHasta
BEGIN
SET @diadescanso=(
SELECT TOP 1
CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin +1)= 2 THEN DATEADD(day, 1, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=900200
)
INSERT INTO #TempPlanTrabajo(Descanso) VALUES(@diadescanso)
Set @FechaDesde=DATEADD(dd,3,@FechaDesde)
END
select * FROM #TempPlanTrabajo
SELECT count(*) as Total FROM #TempPlanTrabajo

al final coloque un count para que me contara los días descansados
y este es el resultado, me muestra las fechas lo cual esta bien ya que mis fechas de Inicio de Jornada siempre es la misma no cambia, solo los conté para ver los días que descanso:

resultado


Si yo quiero ahora agregar una Jornada de (8x2) 8 trabaja y 2 descansa
Coloque en el case
SET @diadescanso=(
SELECT TOP 1
CASE WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin +1)= 2 THEN DATEADD(day, 1, Jornada_Fin)
WHEN DATEDIFF(DD,Jornada_Ini , Jornada_Fin +1)= 8 THEN DATEADD(day, 2, Jornada_Fin) END
FROM CopCalendario
WHERE NumOperador=900200
)
pero para Insert Into como lo puedo hacer:
INSERT INTO #TempPlanTrabajo(Descanso) VALUES(@diadescanso)
Set @FechaDesde=DATEADD(dd,3,@FechaDesde)
intente colocar un case pero me marca error

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