none
Se puede obtener una fecha conociendo el número de semana el día de la semana y el año? RRS feed

  • Pregunta

  • Hola a todos y gracias de antemano

    Se puede obtener una fecha conociendo el número de semana el día de la semana y el año?

    Por ejemplo imaginemos que tengo que sacar las ventas del miércoles 12/07/2017 y compararlas con las del mismo miércoles del año anterior 

    Para obtener los datos de este año no hay problema 

    declare @fec date

    set @fec = '2017-07-12'

    select 
    datepart(ww, @fec) as semana, datepart(dw, @fec) as Dia, datepart(year, @fec) as anno

    Lo que necesito es obtener una fecha con 

    semana 29

    día 3

    año 2016

    Alguien sabe si es posible?

    miércoles, 12 de julio de 2017 15:10

Respuestas

  • Hola que tal Marc Julia, te recomiendo que hagas una tabla con lo que requieres y luego solo hacer un Join para comparar con las ventas, aqui te paso un ejemplo.

    USE Prueba
    GO
    Create table Fechas(
    Fecha date,
    Año int,
    Semana int,
    Dia int)
    
    --Insertas los valores desde tu primera venta
    declare @FechaInicio date='20150101'
    while @FechaInicio<=getdate()
    begin
    insert into Fechas(Fecha,Año,Semana,Dia)
    select @FechaInicio,year(@FechaInicio) Año,
           datepart(ww,@FechaInicio) Semana, 
    	   datepart(dw, @FechaInicio) Año
    set @FechaInicio=dateadd(day,1,@Fechainicio)
    end
    
    --Buscamos los valores
    Select * from Fechas where Año=2016 and Semana=29 and Dia=5

    Cualquier cosa nos consultas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    • Marcado como respuesta Marc Julià jueves, 13 de julio de 2017 7:11
    miércoles, 12 de julio de 2017 17:24
  • Me parece un poco "fuerza bruta" crear una tabla con todas las fechas para un cáculo que se puede hacer al vuelo.

    Solo hay que corregir el hecho de que el año puede comenzar en viernes o en lunes, además de tener en cuenta que dependemos del set datefirst, si es 1, la semana comienza en lunes, si es 2 en martes y así sucesivamente.

    Este código resuelve lo mismo sin tabla 

    set datefirst 1
    declare @año int =2016,@semana int =29,@dia int =5
    declare @inicioaño datetime=cast(cast( @año*10000+101 as varchar) as datetime)
    select dateadd(day,(@semana-1)*7+@dia-DATEPART(WEEKDAY,@inicioaño),@inicioaño)


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Marc Julià jueves, 13 de julio de 2017 10:24
    jueves, 13 de julio de 2017 7:55
    Moderador

Todas las respuestas

  • ¿Has probado algo así?

    Select dateadd(day,3,dateadd(week, 29,cast(cast(2016*10000 +0101 as varchar(8)) as datetime))


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 12 de julio de 2017 15:17
    Moderador
  • Hola que tal Marc Julia, te recomiendo que hagas una tabla con lo que requieres y luego solo hacer un Join para comparar con las ventas, aqui te paso un ejemplo.

    USE Prueba
    GO
    Create table Fechas(
    Fecha date,
    Año int,
    Semana int,
    Dia int)
    
    --Insertas los valores desde tu primera venta
    declare @FechaInicio date='20150101'
    while @FechaInicio<=getdate()
    begin
    insert into Fechas(Fecha,Año,Semana,Dia)
    select @FechaInicio,year(@FechaInicio) Año,
           datepart(ww,@FechaInicio) Semana, 
    	   datepart(dw, @FechaInicio) Año
    set @FechaInicio=dateadd(day,1,@Fechainicio)
    end
    
    --Buscamos los valores
    Select * from Fechas where Año=2016 and Semana=29 and Dia=5

    Cualquier cosa nos consultas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    • Marcado como respuesta Marc Julià jueves, 13 de julio de 2017 7:11
    miércoles, 12 de julio de 2017 17:24
  • Me parece un poco "fuerza bruta" crear una tabla con todas las fechas para un cáculo que se puede hacer al vuelo.

    Solo hay que corregir el hecho de que el año puede comenzar en viernes o en lunes, además de tener en cuenta que dependemos del set datefirst, si es 1, la semana comienza en lunes, si es 2 en martes y así sucesivamente.

    Este código resuelve lo mismo sin tabla 

    set datefirst 1
    declare @año int =2016,@semana int =29,@dia int =5
    declare @inicioaño datetime=cast(cast( @año*10000+101 as varchar) as datetime)
    select dateadd(day,(@semana-1)*7+@dia-DATEPART(WEEKDAY,@inicioaño),@inicioaño)


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Marc Julià jueves, 13 de julio de 2017 10:24
    jueves, 13 de julio de 2017 7:55
    Moderador
  • Gracias, desde luego es mas elegante hacerlo sin tabla ;)
    jueves, 13 de julio de 2017 10:27
  • Además de la elegancia (Que siempre es importante :) ), el tema aquí también es el rendimiento.. 

    me alegro que te guste


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 13 de julio de 2017 10:49
    Moderador