在sql 2012中的日期框架之间获取每个星期日

时间:2014-08-20 12:26:02

标签: sql sql-server

我需要在日期范围之间的每个星期日。例如,如果我的开始日期是2014年7月27日,结束日期是'08 / 10/2014',那么我需要一张桌子 2014年7月27日, 2014年8月3日, 2014年8月10日

    select '2014/7/27' 
    union all
    select dateadd(day, 7,'2014/7/27')
   where '2014/7/27' <= '2014/8/10'

只给我07/27/2014和08/03/2014。请帮忙。

3 个答案:

答案 0 :(得分:3)

如果您尝试以递归查询方式执行此操作,则格式为

WITH cteSundays as ( 
    select dateadd(day, 0, '2014/7/27') as Sunday  
    union all  
    select dateadd(day, 7,Sunday)   
    FROM cteSundays  
    where Sunday <= dateadd(day, -7, '2014/8/10')  
) SELECT * FROM cteSundays  

但请记住,这些受到允许的递归深度的限制。我认为2012年约为100,但您应该尝试确保它能满足您的需求。

编辑:哎呀,原来多了一周,你需要从结束条件中扣除7天

答案 1 :(得分:1)

下面的内容将起作用

declare @startdate datetime, @enddate datetime
set @startdate='20140727'
set @enddate='20140810'
select dateadd(week,number,@startdate) from master..spt_values where type='p' and 
dateadd(week,number,@startdate) <=@enddate

答案 2 :(得分:0)

一种方法,假设@StartDate是星期日:

DECLARE 
      @StartDate date = '2014-07-27'
    , @EndDate date = '2014-08-10';
WITH 
      t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
    , t256 AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d)
SELECT DATEADD(day, n * 7, @StartDate)
FROM t256
WHERE DATEADD(day, n * 7, @StartDate) < = @EndDate;