Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL-根据周数获取开始和结束日期。_Sql_Tsql_Date - Fatal编程技术网

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

T-SQL-根据周数获取开始和结束日期。,sql,tsql,date,Sql,Tsql,Date,我们的业务考虑从星期一到星期日的一周。我需要编写一个T-SQL函数,它将年、周作为参数传入,并返回该周的开始和结束日期。然而,我已经看到了许多例子,但问题在于一年之内 e、 g 2011年12月26日(星期一)-2012年1月1日(星期日)你应该在你的计数中创建一个带有假日和不需要考虑的日子的表格。< /P> 在此之后,计算初始日期和最终日期之间的天数。(步骤1) 在表中选择以检查ini和最终日期之间的间隔天数。(步骤2) 最后用步骤1的结果减去步骤2的结果 这类事情最好是创建一个日历表:主要问

我们的业务考虑从星期一到星期日的一周。我需要编写一个T-SQL函数,它将年、周作为参数传入,并返回该周的开始和结束日期。然而,我已经看到了许多例子,但问题在于一年之内


e、 g 2011年12月26日(星期一)-2012年1月1日(星期日)

你应该在你的计数中创建一个带有假日和不需要考虑的日子的表格。< /P> 在此之后,计算初始日期和最终日期之间的天数。(步骤1)

在表中选择以检查ini和最终日期之间的间隔天数。(步骤2)


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

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

这一列如何:

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
--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]
——删除函数dbo.GetBusinessWeekStart
创建函数dbo.GetBusinessWeekStart(
@斯莫林,
@星期罐头
)
返回日期时间
作为
开始
声明@FirstMonday TINYINT
声明@Result DATETIME

如果为空(@Week,0),您将如何定义一年中的第一周?那么,2011年1月3日至2011年1月9日。一年中的第一个星期一。您可以使用
SET DATEFIRST
指定一周的开始日期。如果您需要假日表,请查看以下脚本:免责声明,我写的,但它是完全免费的…我想您需要从结束日期中减去1。经过进一步审查,我在使用第1周时遇到了糟糕的日期。这几周是以零为基础的,但我更新为以可用性为基础的一周。这在2015年不起作用。由于某种原因,休息一周。如果是第26周,则显示第27周