从T-SQL中的周数中获取日期

Jas*_*son 48 t-sql sql-server date

在Microsoft SQL Server中,我有一个周数

(from DATEPART(wk, datecol)) 
Run Code Online (Sandbox Code Playgroud)

但我想做的是将其重新转换为该周的日期范围.

例如,

SELECT DATEPART(wk, GETDATE())
Run Code Online (Sandbox Code Playgroud)

收益率10.我想从这个数字得出3/1/2009和3/7/2009.

这可能吗?

mwi*_*ahl 35

Quassnoi的答复工作,但那种让你上了钩清理的日期,如果他们是在中午时间(他一周的开始让你早一天比你需要,如果你在中间使用时间当天 - 您可以使用GETDATE()进行测试.

我过去曾经使用过这样的东西:

SELECT 
   CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, DATECOL), DATECOL)), 101),
   CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, DATECOL) - 6, DATECOL)), 101)
Run Code Online (Sandbox Code Playgroud)

这方面的一个附带的好处是,通过使用@@ DATEFIRST你可以处理非标准周开始天(默认是星期天,但SET @@ DATEFIRST你可以改变这一点).

看起来很疯狂,SQL Server中的简单日期操作必须是这个神秘的,但是你去......

  • NB.如果您按照声称更改周开始日,这确实*不起作用.默认的开始工作日是7(星期日),此代码计算假设当前日总是<= 7.如果您将起始工作日设置为1(星期一),此代码会出现负数并最终显示您错误的日期之前. (3认同)
  • 注意。出于类似的原因,我认为它在一年的年初或年底也不起作用 - 说第 1 周在前一年 12 月的某个时间开始,或者第 52 周可能在下一年 1 月的某个时间结束。 (2认同)

小智 19

您可以将@WeekNum和@YearNum设置为您想要的任何内容 - 在此示例中,它们派生自@datecol变量,出于说明目的,该变量设置为GETDATE().获得这些值后,您可以使用以下方法计算一周的日期范围:

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;

  • 最后两行正是我们所需要的!只更改了 5 和 6,因为这里的周从星期一开始,到星期日结束。DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + CAST(pr.Jaar as nvarchar)) + (pr.Week-1), 7) AS StartOfWeek, DATEADD(wk, DATEDIFF(wk, 5, '1/1/' + CAST(pr.Jaar as nvarchar)) + (pr.Week-1), 6) AS EndOfWeek (2认同)

小智 8

回答你的问题:

--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)))
Run Code Online (Sandbox Code Playgroud)