MS SQL Server 2008:获取一周的开始日期和结束日期到下一个8周
我是SQL新手,有人能给我这个场景的查询吗,“我需要显示从今天开始到下一个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
你可以看看这个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