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...

enter image description here

¿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, 4 meses, 29 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 devolver 202053 ...GETDATE()) + 3) debería devolver 202101 ...GETDATE()) + 4) debería devolver 202102

    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