ultimo semana primer partir obtener numero mes inicio funciones fin fecha ayer anterior sql-server tsql date

sql server - primer - Obtenga las fechas de un número de semana en T-SQL



primer dia de la semana sql server (18)

¿Qué tal una función que salta a la semana anterior al número de esa semana y luego pasa a través de los próximos días hasta que cambia el número de la semana (máximo 7 pasos), devolviendo la nueva fecha?

CREATE FUNCTION dbo.fnGetDateFromWeekNo (@weekNo int , @yearNo int) RETURNS smalldatetime AS BEGIN DECLARE @tmpDate smalldatetime set @tmpdate= cast(cast (@yearNo as varchar) + ''-01-01'' as smalldatetime) -- jump forward x-1 weeks to save counting through the whole year set @tmpdate=dateadd(wk,@weekno-1,@tmpdate) -- make sure weekno is not out of range if @WeekNo <= datepart(wk,cast(cast (@yearNo as varchar) + ''-12-31'' as smalldatetime)) BEGIN WHILE (datepart(wk,@tmpdate)<@WeekNo) BEGIN set @tmpdate=dateadd(dd,1,@tmpdate) END END ELSE BEGIN -- invalid weeknumber given set @tmpdate=null END RETURN @tmpDate END

En Microsoft SQL Server, tengo un número de semana

(from DATEPART(wk, datecol))

pero lo que me gustaría hacer es regresar esto al lapso de esa semana.

Por ejemplo,

SELECT DATEPART(wk, GETDATE())

rendimientos 10. Me gustaría derivar el 1/1/2009 y el 3/7/2009 de este número.

es posible?


Acabo de incorporar el SELECTO con una declaración CASE (Para mi situación el lunes marcó el primer día de la semana, y no quise tratar con el comando SET DATEFIRST:

CASE DATEPART(dw,<YourDateTimeField>) WHEN 1 THEN CONVERT(char(10), DATEADD(DD, -6, <YourDateTimeField>),126) + '' to '' + CONVERT(char(10), <YourDateTimeField>,126) WHEN 2 THEN CONVERT(char(10), <YourDateTimeField>,126) + '' to '' + CONVERT(char(10), DATEADD(DD, 6, <YourDateTimeField>),126) WHEN 3 THEN CONVERT(char(10), DATEADD(DD, -1, <YourDateTimeField>),126) + '' to '' + CONVERT(char(10), DATEADD(DD, 5, <YourDateTimeField>),126) WHEN 4 THEN CONVERT(char(10), DATEADD(DD, -2, <YourDateTimeField>),126) + '' to '' + CONVERT(char(10), DATEADD(DD, 4, <YourDateTimeField>),126) WHEN 5 THEN CONVERT(char(10), DATEADD(DD, -3, <YourDateTimeField>),126) + '' to '' + CONVERT(char(10), DATEADD(DD, 3, <YourDateTimeField>),126) WHEN 6 THEN CONVERT(char(10), DATEADD(DD, -4, <YourDateTimeField>),126) + '' to '' + CONVERT(char(10), DATEADD(DD, 2, <YourDateTimeField>),126) WHEN 7 THEN CONVERT(char(10), DATEADD(DD, -5, <YourDateTimeField>),126) + '' to '' + CONVERT(char(10), DATEADD(DD, 1, <YourDateTimeField>),126) ELSE ''UNK'' END AS Week_Range


Aquí solo tienes que pasar el número de año y semana.

DECLARE @Year VARCHAR(4) SET @Year= ''2012'' DECLARE @FirstDate DATETIME SET @FirstDate = (SELECT DATEADD(dd,1,(SELECT DATEADD(wk,DATEPART(wk,GETDATE())-1,Convert(DAteTime,''01-01-'' + @Year)))) ) DECLARE @LastDate DATETIME SET @LastDate =(SELECT DATEADD(dd,4,@FirstDate)) SELECT @FirstDate ,@LastDate


Dale @Year y @Week, devuelve la primera fecha de esa semana.

Declare @Year int ,@Week int ,@YearText varchar(4) set @Year = 2009 set @Week = 10 set @YearText = @Year print dateadd(day ,1 - datepart(dw, @YearText + ''-01-01'') + (@Week-1) * 7 ,@YearText + ''-01-01'')


Esto debería funcionar independientemente de @@DATEFIRST

ALTER FUNCTION dbo.DEV_VW_WeekSerial (@YearNum int, @WeekNum int, @DayNum int) RETURNS Date AS BEGIN DECLARE @FirstDayYear As Date; SET @FirstDayYear=''01/01/'' + CAST(@YearNum As varchar) RETURN dateadd(d,(@DayNum-datepart(weekday,@FirstDayYear)),dateadd(week, @WeekNum-1,@FirstDayYear)) END


La mayoría de las respuestas a los votos funciona bien, excepto la primera semana y la última semana del año. Cuando el valor de datecol sea ''2009-01-01'' , el resultado será el 01/03/2009 y el 28/12/2008 .

Mi solución:

DECLARE @Date date = ''2009-03-01'', @WeekNum int, @StartDate date; SELECT @WeekNum = DATEPART(WEEK, @Date); SELECT @StartDate = DATEADD(DAY, -(DATEPART(WEEKDAY, DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date), 0)) + 6), DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date), 0)); SELECT CONVERT(nvarchar, CASE WHEN @WeekNum = 1 THEN CAST(DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date), 0) AS date) ELSE DATEADD(DAY, 7 * @WeekNum, @StartDate) END, 101) AS StartOfWeek ,CONVERT(nvarchar, CASE WHEN @WeekNum = DATEPART(WEEK, DATEADD(DAY, -1, DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date) + 1, 0))) THEN DATEADD(DAY, -1, DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date) + 1, 0)) ELSE DATEADD(DAY, 7 * @WeekNum + 6, @StartDate) END, 101) AS EndOfWeek;

Esto se mostrará el 01/01/2009 y el 01/03/2009 para la 1ª semana, y se mostrará el 01/03/2009 y el 03/07/2009 durante la 10ª semana.

Creo que esto es lo que quieres exactamente. Puede reemplazar las variables con sus expresiones como lo desee.


La respuesta de Quassnoi funciona, pero te deja en el anzuelo para limpiar las fechas si son fechas a mitad del día (su inicio de semana te deja un día antes de lo que necesitas si usas un tiempo en el medio del día: puede probar usando GETDATE ()).

He usado algo como esto en el pasado:

SELECT CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, DATECOL), DATECOL)), 101), CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, DATECOL) - 6, DATECOL)), 101)

Un beneficio adicional de esto es que al usar @@ DATEFIRST puede manejar días de inicio de semana no estándar (el valor predeterminado es el domingo, pero con SET @@ DATEFIRST puede cambiar esto).

Parece una locura que la manipulación simple de fechas en SQL Server tiene que ser así de misteriosa, pero ahí lo tienes ...


No me tomé el tiempo para probar cada respuesta aquí, pero nada parece tan simple y tan eficiente como esto:

DECLARE @WeekNum int DECLARE @YearNum char(4) SELECT DATEADD(wk, DATEDIFF(wk, 6, ''1/1/'' + @YearNum) + (@WeekNum-1), 6) AS StartOfWeek SELECT DATEADD(wk, DATEDIFF(wk, 5, ''1/1/'' + @YearNum) + (@WeekNum-1), 5) AS EndOfWeek


Para responder tu pregunta:

--CHANGE A WEEK NUMBER BACK INTO A DATE FOR THE FIRST DATE OF THE WEEK DECLARE @TaskWeek INT = 17 DECLARE @TaskYear INT = 2013 SELECT DATEADD(WEEK, @TaskWeek - 1,DATEADD(dd, 1 - DATEPART(dw, ''1/1/'' + CONVERT(VARCHAR(4),@TaskYear)), ''1/1/'' + CONVERT(VARCHAR(4),@TaskYear)))


Puede establecer @WeekNum y @YearNum en lo que desee; en este ejemplo, se derivan de la variable @datecol, que se establece en GETDATE () con fines ilustrativos. Una vez que tenga esos valores, puede calcular el rango de fechas de una semana usando lo siguiente:

DECLARE @datecol datetime = GETDATE(); DECLARE @WeekNum INT , @YearNum char(4); SELECT @WeekNum = DATEPART(WK, @datecol) , @YearNum = CAST(DATEPART(YY, @datecol) AS CHAR(4)); -- once you have the @WeekNum and @YearNum set, the following calculates the date range. SELECT DATEADD(wk, DATEDIFF(wk, 6, ''1/1/'' + @YearNum) + (@WeekNum-1), 6) AS StartOfWeek; SELECT DATEADD(wk, DATEDIFF(wk, 5, ''1/1/'' + @YearNum) + (@WeekNum-1), 5) AS EndOfWeek;


Si su semana comienza desde el lunes (en SQL Server 2008)

select datecol, DATEPART(ISOWK, datecol) as week, ((DATEPART(dw, datecol)+5)%7)+1 as weekday, (DATEADD(dd, -((DATEPART(dw, datecol)+5)%7), datecol)) as Monday, (DATEADD(dd, -((DATEPART(dw, datecol)+5)%7)+6, datecol)) as Sunday


Tomé la solución de elindeblom y la modifiqué: el uso de cadenas (incluso si se lanzan a fechas) me pone nervioso por los diferentes formatos de fechas que se usan en todo el mundo. Esto evita ese problema.

Aunque no se solicitó, también he incluido el tiempo para que la semana termine 1 segundo antes de la medianoche:

DECLARE @WeekNum INT = 12, @YearNum INT = 2014 ; SELECT DATEADD(wk, DATEDIFF(wk, 6, CAST(RTRIM(@YearNum * 10000 + 1 * 100 + 1) AS DATETIME)) + ( @WeekNum - 1 ), 6) AS [start_of_week], DATEADD(second, -1, DATEADD(day, DATEDIFF(day, 0, DATEADD(wk, DATEDIFF(wk, 5, CAST(RTRIM(@YearNum * 10000 + 1 * 100 + 1) AS DATETIME)) + ( @WeekNum + -1 ), 5)) + 1, 0)) AS [end_of_week] ;

Sí, sé que todavía estoy emitiendo pero de un número. Se "siente" más seguro para mí.

Esto resulta en:

start_of_week end_of_week ----------------------- ----------------------- 2014-03-16 00:00:00.000 2014-03-22 23:59:59.000


Esto funciona para mí:

select convert(varchar(50), dateadd(dd, - datepart(dw, DATECOL) + 1, DATECOL), 101), convert(varchar(50), dateadd(dd, - datepart(dw, DATECOL) + 7, DATECOL), 101)


Responder:

select DateAdd(day,-DATEPart(DW,<Date>), <Date>) [FirstDayOfWeek] ,DateAdd(day,-DATEPart(DW,<Date>)+6, <Date>) [LastDayOfWeek] FROM <TABLE>


DECLARE @dayval int, @monthval int, @yearval int SET @dayval = 1 SET @monthval = 1 SET @yearval = 2011 DECLARE @dtDateSerial datetime SET @dtDateSerial = DATEADD(day, @dayval-1, DATEADD(month, @monthval-1, DATEADD(year, @yearval-1900, 0) ) ) DECLARE @weekno int SET @weekno = 53 DECLARE @weekstart datetime SET @weekstart = dateadd(day, 7 * (@weekno -1) - datepart (dw, @dtDateSerial), @dtDateSerial) DECLARE @weekend datetime SET @weekend = dateadd(day, 6, @weekstart) SELECT @weekstart, @weekend


SELECT DATEADD(week, @weekNumber - 1, DATEADD(DAY, @@datefirst - DATEPART(weekday, CAST(YEAR(GETDATE()) AS VARCHAR) + ''-01-01'') - 6, CAST(YEAR(GETDATE()) AS VARCHAR) + ''-01-01''))


SELECT DATECOL - DATEPART(weekday, DATECOL), DATECOL - DATEPART(weekday, DATECOL) + 7


dateadd( dd, datepart(wk, @Date)*7, convert(smalldatetime, convert(char,year(max(@Date)))+convert(char, ''-01-01'')) )-1