2

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

  1. 开始日期 | 结束日期
  2. 2012 年 3 月 17 日 | 23/03/2012
  3. 2012 年 3 月 24 日 | 29/03/2012
  4. .. ETC
  5. 2012 年 4 月 28 日 |2013 年 3 月 5 日
4

3 回答 3

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
于 2013-03-21T11:24:06.490 回答
0

你可以看看这个 StackOverFlow 帖子: 在 TSQL 中生成递增日期的结果集

或者

以下应该给你这个结果:

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

希望这可以帮助!

于 2013-03-21T10:36:13.870 回答
0

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

;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在 StackOverflow 的其他地方发布了一个非常有用的范围函数 ,我喜欢在这些场景中使用它。

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))

这允许您使用简单的SELECT Number FROM RANGE(0,10). 定义此函数后,原始代码可以简化为以下内容:

;WITH w(weeknumber) AS
    (SELECT Number FROM Range(0,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

然后,将其扩展为采用参数表示向前投射的周数将是一个简单的更改。

于 2013-03-21T11:20:01.337 回答