我是 SQL 新手,谁能给我这个场景的查询,“我需要显示从今天开始到接下来 8 周的一周的开始日期和结束日期”。例如,如果我选择今天的日期,它应该显示
- 开始日期 | 结束日期
- 2012 年 3 月 17 日 | 23/03/2012
- 2012 年 3 月 24 日 | 29/03/2012
- .. ETC
- 2012 年 4 月 28 日 |2013 年 3 月 5 日
我是 SQL 新手,谁能给我这个场景的查询,“我需要显示从今天开始到接下来 8 周的一周的开始日期和结束日期”。例如,如果我选择今天的日期,它应该显示
试试这个:
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
你可以看看这个 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
希望这可以帮助!
如果您想避免迭代(例如,如果您需要在视图中使用此数据),您可以使用以下技术:
;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
然后,将其扩展为采用参数表示向前投射的周数将是一个简单的更改。