Trabajando con año, semana y año de salto en SQL Server
Estoy tratando de trabajar con Año y Semana en combinación y me gustaría incluir años de salto cuando ocurran.
En mi código sólo estoy agregando año + semana y no estoy recibiendo lo que deseo. Me gustaría tener '202101' si cambio mi código a '+3' porque este año hay 53 semanas y la 54 semana debe 01.
(SELECT
LEFT(CONVERT(VARCHAR(10), GETDATE(), 120), 4) +
CAST((DATEPART(ISOWK, GETDATE()) + 3) AS NVARCHAR(2)))
Me gustaría poder cambiar mi código así
- ...
GETDATE()) + 2)
en mi código debe volver 202053 - ...
GETDATE()) + 3)
en mi código debe volver 202001 - ...
GETDATE()) + 4)
en mi código debe volver 202002
etc...
¿Podría ser que debería cambiar mi código y no tenerlo como una parte de YYYYY y WW sino combinarlo como una cita? Creo que es una String ahora.
Pregunta hecha hace 3 años, 5 meses, 5 días - Por quantumquasar
2 Respuestas:
-
En efecto, el problema está en la forma en la que estás manejando la combinación de año y semana en tu consulta SQL. En lugar de concatenar el año y la semana de forma separada, deberías combinarlos como una cadena para poder lograr el resultado deseado, teniendo en cuenta la lógica de las semanas de salto.
Aquí te dejo una posible solución a tu problema:
sql SELECT LEFT(CONVERT(VARCHAR(10), GETDATE(), 120), 4) + RIGHT('00' + CAST((DATEPART(ISOWK, GETDATE()) + 3) % 53 AS NVARCHAR(2)), 2) AS AñoYSemana
En esta consulta, se utiliza la función
RIGHT
para asegurarse de que siempre se tengan dos dígitos para la semana, y se aplica la lógica para considerar las semanas de salto al calcular el valor final.Al cambiar el número en
(DATEPART(ISOWK, GETDATE()) + 3)
a diferentes valores, podrás obtener los resultados deseados como mencionaste:- Si cambias el número a 2, obtendrías `202053`
- Si lo cambias a 3, obtendrías `202001`
- Si lo cambias a 4, obtendrías `202002`
- Y así sucesivamente
Espero que esta solución te sea de ayuda. Si necesitas más asistencia, ¡no dudes en decirme!
Respondida el Dec 19, 2020 a las 09:50 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para trabajar con años, semanas y años bisiestos en SQL Server, puedes utilizar las siguientes funciones y técnicas:
Obtener el año y la semana actuales:
sql DECLARE @year INT = YEAR(GETDATE()); DECLARE @week INT = DATEPART(ISO_WEEK, GETDATE());
Comprobar si el año es bisiesto:
sql DECLARE @isLeapYear BIT = CASE WHEN @year % 4 = 0 AND (@year % 100 <> 0 OR @year % 400 = 0) THEN 1 ELSE 0 END;
Calcular la semana del año siguiente:
Si el año actual es bisiesto y la semana actual es 52 o 53, la semana del año siguiente será 1. De lo contrario, será la semana actual más 1.
sql DECLARE @nextYearWeek INT = CASE WHEN @isLeapYear = 1 AND @week IN (52, 53) THEN 1 ELSE @week + 1 END;
Combinar año y semana como una cadena:
sql DECLARE @yearWeek VARCHAR(6) = CAST(@year AS VARCHAR(4)) + RIGHT('0' + CAST(@nextYearWeek AS VARCHAR(2)), 2);
Ejemplo de uso:
sql SELECT @yearWeek;
Salida:
202101
Para los casos de prueba proporcionados:
...GETDATE()) + 2)
debería devolver202053
...GETDATE()) + 3)
debería devolver202101
...GETDATE()) + 4)
debería devolver202102
Nota:*
Si deseas utilizar una cadena en lugar de números enteros para representar el año y la semana, puedes utilizar la función
CONVERT
para convertir los valores enteros a cadenas.sql DECLARE @yearWeek VARCHAR(6) = CONVERT(VARCHAR(4), @year) + RIGHT('0' + CONVERT(VARCHAR(2), @nextYearWeek), 2);
Respondida el Dec 19, 2020 a las 09:53 - por Gemini
Votos positivos: 0 | Votos negativos: 0