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

时间:2011-12-19 21:52:24

标签: sql tsql date

我们的业务从(周一至周日)算起一周。我需要编写一个T-SQL函数,该函数以年份为单位传递,周数为参数,它将返回该周的开始和结束日期。不过我看过很多例子,但问题在于年内重叠。

例如,2011年12月26日(星期一) - 2012年1月1日(星期日)......<<我想将此视为2011年的最后一周。

并且在T-SQL中,datepart(ww,DATE)将星期日视为一周的开始?

或者我是否更好地使用no no创建自己的表并存储其开始和结束日期?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您应该创建一个表格,其中包含假期和您不想在计算中考虑的日期。

在此之后计算初始日期和最终日期之间的天数。 (步骤1)

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

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

答案 2 :(得分:0)

这就是你最好创建一个日历表的方法:主要问题是知道填充它的过去/未来有多远,但除此之外,让表模式包括周数和日期。根据您想要执行的其他基于日期的查询,您可能希望有其他列将日期分解为其组成部分(例如,有三个单独的列,用于日/月/年/日期名称等)。

答案 3 :(得分:0)

这个怎么样:

--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 @FirstMonday=@FirstMonday+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]