Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
MS SQL Server 2008:获取一周的开始日期和结束日期到下一个8周_Sql_Sql Server 2008_Tsql - Fatal编程技术网

MS SQL Server 2008:获取一周的开始日期和结束日期到下一个8周

MS SQL Server 2008:获取一周的开始日期和结束日期到下一个8周,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我是SQL新手,有人能给我这个场景的查询吗,“我需要显示从今天开始到下一个8周的一周的开始日期和结束日期”。例如,如果我选择今天的日期,它应该显示 开始日期|结束日期 2012年3月17日至2012年3月23日 2012年3月24日至2012年3月29日 。。等 2012年4月28日至2013年5月3日 你可以看看这个StackOverFlow帖子: 或 以下内容将给出该结果: declare @dateIterator datetime = getdate(); declare @endDa

我是SQL新手,有人能给我这个场景的查询吗,“我需要显示从今天开始到下一个8周的一周的开始日期和结束日期”。例如,如果我选择今天的日期,它应该显示

  • 开始日期|结束日期
  • 2012年3月17日至2012年3月23日
  • 2012年3月24日至2012年3月29日
  • 。。等
  • 2012年4月28日至2013年5月3日

  • 你可以看看这个StackOverFlow帖子:

    以下内容将给出该结果:

    declare @dateIterator datetime = getdate();
    declare @endDate datetime = dateadd(week, 8, getdate());
    declare @dateRange varchar(max) = '';
    
    while @dateIterator < @endDate
    begin
        set @dateIterator = dateadd(day, 1, @dateIterator);
        set @dateRange = @dateRange + ' ' + convert(varchar(10), @dateIterator, 3)
    end
    
    select @dateRange
    
    declare@dateIterator datetime=getdate();
    声明@endDate datetime=dateadd(第8周,getdate());
    声明@dateRange varchar(max)='';
    而@dateIterator<@endDate
    开始
    设置@dateIterator=dateadd(第1天,@dateIterator);
    set@dateRange=@dateRange+''+convert(varchar(10),@dateIterator,3)
    结束
    选择@dateRange
    

    希望这有帮助

    如果要避免迭代(例如,如果在视图中需要此数据),可以使用以下技术:

    ;WITH w(weeknumber) AS
        (SELECT 0
            UNION SELECT 1
            UNION SELECT 2
            UNION SELECT 3
            UNION SELECT 4
            UNION SELECT 5
            UNION SELECT 6
            UNION SELECT 7), 
     f(firstdayofweek) AS
         (SELECT DATEADD(ww,DATEDIFF(ww,0,GETDATE()),0)),
     o(offsetweekdate) AS
         (SELECT DATEADD(ww,w.weeknumber,f.firstdayofweek) FROM w,f)
    SELECT
        DATEADD(d,0,o.offsetweekdate) AS firstdayofweek,
        DATEADD(d,6,o.offsetweekdate) AS lastdayofweek
    FROM o
    
    在这里,
    w
    生成一个从0到7的数字列表,
    f
    查找一周的第一天,
    o
    将这两个数字结合起来,给出接下来8周的开始和结束日期

    这样做的缺点是,要增加预测的远期周数,需要在w的定义中添加一行额外的内容。这是因为在不使用循环的情况下,没有使用TSQL生成一系列值的内置方法

    Jeff Moden发布了一个非常有用的范围函数,我喜欢在这种情况下使用它

    CREATE FUNCTION [dbo].[Range](@startvalue integer,@endvalue integer)
    RETURNS TABLE
    AS 
    RETURN(
    WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
         E02(N) AS (SELECT 1 FROM E00 a, E00 b),
         E04(N) AS (SELECT 1 FROM E02 a, E02 b),
         E08(N) AS (SELECT 1 FROM E04 a, E04 b),
         E16(N) AS (SELECT 1 FROM E08 a, E08 b),
         E32(N) AS (SELECT 1 FROM E16 a, E16 b),
    cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
    SELECT TOP (@endvalue-@startvalue+1) (N+@startvalue-1) AS Number
        FROM cteTally
    WHERE N <= (@endvalue-@startvalue+1))
    
    然后,将这一点扩展为为项目转发的周数取一个参数,这将是一个简单的更改

    试试这个:

    DECLARE @startDate DATETIME
    DECLARE @currentDate DATETIME
    DECLARE @numberOfWeeks INT
    
    DECLARE @dates TABLE(
        StartDate DateTime,
        EndDate DateTime 
    )
    
    SET @startDate = GETDATE()--'2012-01-01' -- Put whatever you want here
    SET @numberOfWeeks = 8 -- Choose number of weeks here
    SET @currentDate = @startDate
    
    while @currentDate < dateadd(week, @numberOfWeeks, @startDate)
    begin
        INSERT INTO @Dates(StartDate, EndDate) VALUES (@currentDate, dateadd(day, 6, @currentDate))
        set @currentDate = dateadd(day, 7, @currentDate);
    end
    
    SELECT * FROM @dates
    
    如果不需要时间组件,也可以调整最终选择,如下所示:

    StartDate           EndDate 
    21/03/2013 11:22:46 27/03/2013 11:22:46 
    28/03/2013 11:22:46 03/04/2013 11:22:46 
    04/04/2013 11:22:46 10/04/2013 11:22:46 
    11/04/2013 11:22:46 17/04/2013 11:22:46 
    18/04/2013 11:22:46 24/04/2013 11:22:46 
    25/04/2013 11:22:46 01/05/2013 11:22:46 
    02/05/2013 11:22:46 08/05/2013 11:22:46 
    09/05/2013 11:22:46 15/05/2013 11:22:46 
    
    SELECT CONVERT(VARCHAR, StartDate, 103), CONVERT(VARCHAR, EndDate, 103) FROM @dates
    

    抱歉,我需要两列,一列是startdate,另一列是特定周的enddate
    SELECT CONVERT(VARCHAR, StartDate, 103), CONVERT(VARCHAR, EndDate, 103) FROM @dates