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

[SOLUCIONADO] Semana 53

Estas en el tema de Semana 53 en el foro de SQL Server en Foros del Web. Hola a todos, buen día, me gustaría su apoyo con mi porción de código, estoy validando una fecha_de_pago de clientes para colocarlas en diferentes CASES, ...
  #1 (permalink)  
Antiguo 07/11/2017, 10:44
Avatar de Lenin_Germaine  
Fecha de Ingreso: junio-2007
Ubicación: Monterrey, Nuevo León
Mensajes: 82
Antigüedad: 10 años, 4 meses
Puntos: 0
Semana 53

Hola a todos, buen día, me gustaría su apoyo con mi porción de código, estoy validando una fecha_de_pago de clientes para colocarlas en diferentes CASES, del 1 al 9, es decir dependiendo de la semana en que caigan del 1 al 9 las clasifico, el detalle es que las acomodo a partir de la semana en que estoy hoy que es la 1, y lo hacía bien el detalle es que llega al día 31 de diciembre marca como semana 53 y ya no funciona mi código, incluso cuando la compara con el cambio de año, es decir la semana 53 contra la semana 1, alguna idea?. Les dejo mi código. Gracias.

Código:
CASE 
WHEN (DATEPART(wk, GETDATE())= DATEPART(wk, c.FechaProbablePago)) 
AND DATEPART(yyyy, GETDATE())=DATEPART(yyyy, c.FechaProbablePago) 
THEN --c.AbonoCuentaProveedor 
c.AbonoCuentaProveedor - isNull ((Select Sum(Monto) From medacasa18.dbo.CtbPolizasDetAP x Where x.IdPolizaDetAbono =  b.IdPolizaDet),0)
END SEM1, 

CASE
WHEN 
DATEPART(wk,DATEADD(WK, 1, GETDATE())) = DATEPART(wk, c.FechaProbablePago) AND 
DATEPART(yyyy,DATEADD(WK, 1, GETDATE()))=DATEPART(yyyy, c.FechaProbablePago) 
THEN --c.AbonoCuentaProveedor 
c.AbonoCuentaProveedor - isNull ((Select Sum(Monto) From medacasa18.dbo.CtbPolizasDetAP x Where x.IdPolizaDetAbono =  b.IdPolizaDet),0)
END SEM2,

--Aqui le siguen iguales prociones del 3 al 8, y continuamos finalmente con el 9 noveno.

CASE
WHEN 
DATEPART(wk,DATEADD(WK, 8, GETDATE())) = DATEPART(wk, c.FechaProbablePago) AND 
DATEPART(yyyy,DATEADD(WK, 8, GETDATE()))=DATEPART(yyyy, c.FechaProbablePago) 
THEN --c.AbonoCuentaProveedor 
c.AbonoCuentaProveedor - isNull ((Select Sum(Monto) From medacasa18.dbo.CtbPolizasDetAP x Where x.IdPolizaDetAbono =  b.IdPolizaDet),0)
END SEM9,
  #2 (permalink)  
Antiguo 07/11/2017, 10:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.111
Antigüedad: 11 años, 3 meses
Puntos: 728
Respuesta: Semana 53

porque haces esta validacion?

Código SQL:
Ver original
  1. DATEPART(wk,DATEADD(WK, 1, GETDATE())) = DATEPART(wk, c.FechaProbablePago) AND
  2. DATEPART(yyyy,DATEADD(WK, 1, GETDATE()))=DATEPART(yyyy, c.FechaProbablePago)

para que agregas una semana a la fecha actual? y luego le sacas el año? si es 31 de diciembre entonces se convierte en el siguiente año no?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 07/11/2017, 10:58
Avatar de Lenin_Germaine  
Fecha de Ingreso: junio-2007
Ubicación: Monterrey, Nuevo León
Mensajes: 82
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Semana 53

lo que hago es a la semana actual le sumo una semana por cada bloque para "adelantarla por semanas" y la comparo con la semana en la que cae la c.FechaProbablePago si son iguales entonces cae en esa semana del 1 al 9 además le compruebo que si sea de su año actual, nada mas que ahorita las fechas de diciembre 31 y enero 1,2,3,4,5,6,7,8 no me las toma y se brinca



Cita:
Iniciado por Libras Ver Mensaje
porque haces esta validacion?

Código SQL:
Ver original
  1. DATEPART(wk,DATEADD(WK, 1, GETDATE())) = DATEPART(wk, c.FechaProbablePago) AND
  2. DATEPART(yyyy,DATEADD(WK, 1, GETDATE()))=DATEPART(yyyy, c.FechaProbablePago)

para que agregas una semana a la fecha actual? y luego le sacas el año? si es 31 de diciembre entonces se convierte en el siguiente año no?
  #4 (permalink)  
Antiguo 07/11/2017, 11:16
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.111
Antigüedad: 11 años, 3 meses
Puntos: 728
Respuesta: Semana 53

No entiendo tu problematica, si explicas mas a detalle(con datos) se te podria ayudar
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 07/11/2017, 11:28
Avatar de Lenin_Germaine  
Fecha de Ingreso: junio-2007
Ubicación: Monterrey, Nuevo León
Mensajes: 82
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Semana 53

es que la consulta en la parte de las comparaciones :

DATEPART(wk,DATEADD(WK, 8, GETDATE())) = DATEPART(wk, c.FechaProbablePago) AND
DATEPART(yyyy,DATEADD(WK, 8, GETDATE()))=DATEPART(yyyy, c.FechaProbablePago)

no compara bien conforme se acerca el cambio de año, debido a la semana 53 que me resulta y la semana 1, es decir si la c.FechaProbablePago cae el dia 8 de enero se supone deberia de caer en la semana 9 pero no me la toma porque la semana se resetea a 1, ahi tendras algunas ideas de como hacerle?




Cita:
Iniciado por Libras Ver Mensaje
No entiendo tu problematica, si explicas mas a detalle(con datos) se te podria ayudar
  #6 (permalink)  
Antiguo 07/11/2017, 11:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.111
Antigüedad: 11 años, 3 meses
Puntos: 728
Respuesta: Semana 53

Ya mas o menos entendi que es lo que quieres hacer, ahorita tienes el problema con la semana 9, la siguiente semana lo vas a tener con la 8 y la 9 y asi sucesivamente, no seria mas facil sacar un datediff de semanas?

Código SQL:
Ver original
  1. SELECT
  2. CASE
  3. WHEN datediff(wk,getdate(), c.FechaProbablePago)=1
  4. THEN
  5. c.AbonoCuentaProveedor - isNull ((SELECT SUM(Monto) FROM medacasa18.dbo.CtbPolizasDetAP x WHERE x.IdPolizaDetAbono =  b.IdPolizaDet),0)
  6. END SEM1,
  7. CASE
  8. WHEN datediff(wk,getdate(), c.FechaProbablePago)=2
  9. THEN
  10. c.AbonoCuentaProveedor - isNull ((SELECT SUM(Monto) FROM medacasa18.dbo.CtbPolizasDetAP x WHERE x.IdPolizaDetAbono =  b.IdPolizaDet),0)
  11. END SEM2



Código SQL:
Ver original
  1. CREATE TABLE #fechas(
  2. fecha datetime
  3. )
  4.  
  5. INSERT INTO #fechas VALUES (dateadd(wk,1,getdate()))
  6. INSERT INTO #fechas VALUES (dateadd(wk,2,getdate()))
  7. INSERT INTO #fechas VALUES (dateadd(wk,3,getdate()))
  8. INSERT INTO #fechas VALUES (dateadd(wk,4,getdate()))
  9. INSERT INTO #fechas VALUES (dateadd(wk,5,getdate()))
  10. INSERT INTO #fechas VALUES (dateadd(wk,6,getdate()))
  11. INSERT INTO #fechas VALUES (dateadd(wk,7,getdate()))
  12. INSERT INTO #fechas VALUES (dateadd(wk,8,getdate()))
  13. INSERT INTO #fechas VALUES (dateadd(wk,9,getdate()))
  14. INSERT INTO #fechas VALUES (dateadd(wk,10,getdate()))
  15. INSERT INTO #fechas VALUES (dateadd(wk,11,getdate()))
  16.  
  17.  
  18.  
  19.  
  20. SELECT datediff(wk,getdate(), fecha) AS wk,
  21. fecha FROM #fechas



wk fecha
1 2017-11-14 14:06:05.087
2 2017-11-21 14:06:05.100
3 2017-11-28 14:06:05.100
4 2017-12-05 14:06:05.100
5 2017-12-12 14:06:05.100
6 2017-12-19 14:06:05.100
7 2017-12-26 14:06:05.100
8 2018-01-02 14:06:05.100
9 2018-01-09 14:06:05.100
10 2018-01-16 14:06:05.100
11 2018-01-23 14:06:05.100
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 07/11/2017, 12:42
Avatar de Lenin_Germaine  
Fecha de Ingreso: junio-2007
Ubicación: Monterrey, Nuevo León
Mensajes: 82
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Semana 53

Hola, las calcula bien , solo que en semanas normales, y el detalle es que necesito hacer que la semana inicie en sabado(SET DATEFIRST 6) y no de manera normal calendario, me parece que datediff no me respeta al DATEFIRST, alguna idea?.


Cita:
Iniciado por Libras Ver Mensaje
Ya mas o menos entendi que es lo que quieres hacer, ahorita tienes el problema con la semana 9, la siguiente semana lo vas a tener con la 8 y la 9 y asi sucesivamente, no seria mas facil sacar un datediff de semanas?

Código SQL:
Ver original
  1. SELECT
  2. CASE
  3. WHEN datediff(wk,getdate(), c.FechaProbablePago)=1
  4. THEN
  5. c.AbonoCuentaProveedor - isNull ((SELECT SUM(Monto) FROM medacasa18.dbo.CtbPolizasDetAP x WHERE x.IdPolizaDetAbono =  b.IdPolizaDet),0)
  6. END SEM1,
  7. CASE
  8. WHEN datediff(wk,getdate(), c.FechaProbablePago)=2
  9. THEN
  10. c.AbonoCuentaProveedor - isNull ((SELECT SUM(Monto) FROM medacasa18.dbo.CtbPolizasDetAP x WHERE x.IdPolizaDetAbono =  b.IdPolizaDet),0)
  11. END SEM2



Código SQL:
Ver original
  1. CREATE TABLE #fechas(
  2. fecha datetime
  3. )
  4.  
  5. INSERT INTO #fechas VALUES (dateadd(wk,1,getdate()))
  6. INSERT INTO #fechas VALUES (dateadd(wk,2,getdate()))
  7. INSERT INTO #fechas VALUES (dateadd(wk,3,getdate()))
  8. INSERT INTO #fechas VALUES (dateadd(wk,4,getdate()))
  9. INSERT INTO #fechas VALUES (dateadd(wk,5,getdate()))
  10. INSERT INTO #fechas VALUES (dateadd(wk,6,getdate()))
  11. INSERT INTO #fechas VALUES (dateadd(wk,7,getdate()))
  12. INSERT INTO #fechas VALUES (dateadd(wk,8,getdate()))
  13. INSERT INTO #fechas VALUES (dateadd(wk,9,getdate()))
  14. INSERT INTO #fechas VALUES (dateadd(wk,10,getdate()))
  15. INSERT INTO #fechas VALUES (dateadd(wk,11,getdate()))
  16.  
  17.  
  18.  
  19.  
  20. SELECT datediff(wk,getdate(), fecha) AS wk,
  21. fecha FROM #fechas



wk fecha
1 2017-11-14 14:06:05.087
2 2017-11-21 14:06:05.100
3 2017-11-28 14:06:05.100
4 2017-12-05 14:06:05.100
5 2017-12-12 14:06:05.100
6 2017-12-19 14:06:05.100
7 2017-12-26 14:06:05.100
8 2018-01-02 14:06:05.100
9 2018-01-09 14:06:05.100
10 2018-01-16 14:06:05.100
11 2018-01-23 14:06:05.100
  #8 (permalink)  
Antiguo 07/11/2017, 12:59
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.111
Antigüedad: 11 años, 3 meses
Puntos: 728
Respuesta: Semana 53

Se puede usar el datediff con el datefirst:

Código SQL:
Ver original
  1. CREATE TABLE #fechas(
  2. fecha datetime
  3. )
  4.  
  5. INSERT INTO #fechas VALUES (getdate())
  6. INSERT INTO #fechas VALUES (dateadd(wk,1,getdate()))
  7. INSERT INTO #fechas VALUES (dateadd(wk,2,getdate()))
  8. INSERT INTO #fechas VALUES (dateadd(wk,3,getdate()))
  9. INSERT INTO #fechas VALUES (dateadd(wk,4,getdate()))
  10. INSERT INTO #fechas VALUES (dateadd(wk,5,getdate()))
  11. INSERT INTO #fechas VALUES (dateadd(wk,6,getdate()))
  12. INSERT INTO #fechas VALUES (dateadd(wk,7,getdate()))
  13. INSERT INTO #fechas VALUES (dateadd(wk,8,getdate()))
  14. INSERT INTO #fechas VALUES (dateadd(wk,9,getdate()))
  15. INSERT INTO #fechas VALUES (dateadd(wk,10,getdate()))
  16. INSERT INTO #fechas VALUES (dateadd(wk,11,getdate()))
  17. INSERT INTO #fechas VALUES (dateadd(dd,-3, getdate()))
  18.  
  19. SET datefirst 6
  20.  
  21. SELECT DATEDIFF( week,
  22.   DATEADD(DAY, -@@DATEFIRST, getdate()),
  23.   DATEADD(DAY, -@@DATEFIRST,  fecha)) AS wk, fecha FROM #fechas

wk fecha
1 2017-11-14 14:06:05.087
2 2017-11-21 14:06:05.100
3 2017-11-28 14:06:05.100
4 2017-12-05 14:06:05.100
5 2017-12-12 14:06:05.100
6 2017-12-19 14:06:05.100
7 2017-12-26 14:06:05.100
8 2018-01-02 14:06:05.100
9 2018-01-09 14:06:05.100
10 2018-01-16 14:06:05.100
11 2018-01-23 14:06:05.100
0 2017-11-07 15:13:13.320
0 2017-11-04 15:14:43.727
-1 2017-11-03 15:17:37.273


Si te fijas el dia 4 es inicio de la semana Actual(semana 0) si agregamos la fecha del domingo (3 de noviembre) es la semana -1

Referencia AQUI
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 07/11/2017, 14:56
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.111
Antigüedad: 11 años, 3 meses
Puntos: 728
Respuesta: Semana 53

y funciono o no???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 07/11/2017, 16:04
Avatar de Lenin_Germaine  
Fecha de Ingreso: junio-2007
Ubicación: Monterrey, Nuevo León
Mensajes: 82
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Semana 53

Muchas gracias, Obviamente funcionó y perfecto, la verdad me resultó super bien de momento.

Saludos.


Cita:
Iniciado por Libras Ver Mensaje
y funciono o no???
  #11 (permalink)  
Antiguo 13/11/2017, 10:53
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.475
Antigüedad: 10 años, 4 meses
Puntos: 180
Respuesta: Semana 53

¿Y las chelas? (jajajaja)
__________________
MCTS Isaias Islas
  #12 (permalink)  
Antiguo 13/11/2017, 13:04
Avatar de Lenin_Germaine  
Fecha de Ingreso: junio-2007
Ubicación: Monterrey, Nuevo León
Mensajes: 82
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Semana 53

  #13 (permalink)  
Antiguo 14/11/2017, 11:06
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.475
Antigüedad: 10 años, 4 meses
Puntos: 180
Respuesta: Semana 53

Eso es todo, salud !!!
__________________
MCTS Isaias Islas



La zona horaria es GMT -6. Ahora son las 08:28.