T-SQL - 根据周数获取开始和结束日期。

T-SQL - 根据周数获取开始和结束日期。

问题描述:

我们的业务考虑从(星期一 - 星期日)开始的一周。我需要编写一个T-SQL函数,该函数在一年中通过,而不是作为参数传递,它将返回该周的开始和结束日期。不过,我见过很多例子,但问题在于一年内重叠。T-SQL - 根据周数获取开始和结束日期。

如2011年12月26日(星期一) - 2012年1月1日(星期日)... < <会想认为这是上周的2011

而且还在T-SQL日期部分( ww,DATE)认为星期日是本周的开始?

还是我最好创建自己的表,并保存它的开始和结束日期?

+0

你会如何定义这一年的第一个星期? – Andomar 2011-12-19 21:55:05

+0

那么,2011年1月3日 - 2011年1月9日。今年的第一个星期一。 – user1106741 2011-12-19 22:00:24

+0

您可以使用'SET DATEFIRST'来指定星期的开始日期。 – Magnus 2011-12-19 22:16:16

DECLARE 
    @Year INT, 
    @Week INT, 
    @FirstDayOfYear DATETIME, 
    @FirstMondayOfYear DATETIME, 
    @StartDate DATETIME, 
    @EndDate DATETIME 

SET @Year = 2011 
SET @Week = 52 

-- Get the first day of the provided year. 
SET @FirstDayOfYear = CAST('1/1/' + CAST(@YEAR AS VARCHAR) AS DATETIME) 

-- Get the first monday of the year, then add the number of weeks. 
SET @FirstMondayOfYear = DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, @FirstDayOfYear), @FirstDayOfYear)), 0) 

SET @StartDate = DATEADD(WEEK, @Week - 1, @FirstMondayOfYear) 

-- Set the end date to one week past the start date. 
SET @EndDate = DATEADD(WEEK, 1, @StartDate) 

SELECT @StartDate AS StartDate, DATEADD(SECOND, -1, @EndDate) AS EndDate 
+0

我认为你需要从结束日期减去1。经过进一步的审查,我在使用第1周时会收到不好的日期。 – UnhandledExcepSean 2011-12-19 22:40:35

+0

@SpectralGhost感谢您的更正,更新。 – 2011-12-19 22:43:20

+0

这几周是基于零的,但我更新为基于可用性的一个。 – 2011-12-19 22:45:06

你应该创建一个包含假期和日子的表格,你不需要考虑你的计数。

之后,计算出初始日期和最终日期之间的日期。 (步骤1)

请在您的表格中选择,查看您的ini和最终日期之间有多少天。 (步骤2)

最后用步骤1的结果减去步骤2的结果;

+0

如果您需要假期表,请查看以下脚本:http://www.sqlservercentral.com/scripts/Date+Manipulation/74302/免责声明,我写了它,但它完全免费... – Sparky 2011-12-19 22:23:24

这是诸如此类的事情,你最好创建一个日历表:主要的问题是知道如何遥远的过去/未来来填充它,但除此之外,有表模式包括周数量和日期。根据您想要执行的其他日期查询,您可能需要额外的列来将日期分解为其构成部分(例如,对于日/月/年/日的名称,具有三个单独的列)。

这个怎么样:

--DROP FUNCTION dbo.GetBusinessWeekStart 
CREATE FUNCTION dbo.GetBusinessWeekStart(
    @Year SMALLINT, 
    @Week TINYINT 
) 
RETURNS DATETIME 
AS 
BEGIN 
    DECLARE @FirstMonday TINYINT 
    DECLARE @Result DATETIME 

    IF ISNULL(@Week,0)<1 OR ISNULL(@Year,0)<1900 
     BEGIN 
      SET @Result= NULL; 
     END 
    ELSE 
     BEGIN 
      SET @FirstMonday=1 

      WHILE DATEPART(dw,CONVERT(DATETIME, '01/0' + CONVERT(VARCHAR,@FirstMonday) + '/' + CONVERT(VARCHAR,@Year)))<>2 
      BEGIN 
       SET @[email protected]+1 
      END 

      SET @Result=CONVERT(DATETIME, '01/0' + CONVERT(VARCHAR,@FirstMonday) + '/' + CONVERT(VARCHAR,@Year)) 
      SET @Result=DATEADD(d,(@Week-1)*7,@Result) 

      IF DATEPART(yyyy,@Result)<>@Year 
       BEGIN 
        SET @Result= NULL; 
       END 
     END 

    RETURN @Result 
END 
GO 

--Example 
SELECT dbo.GetBusinessWeekStart(2011,15) [Start],dbo.GetBusinessWeekStart(2011,15)+6 [End]