Sql server 从sql server当前日期的下周开始,获取每个星期四的26个日期

Sql server 从sql server当前日期的下周开始,获取每个星期四的26个日期,sql-server,Sql Server,我需要得到从下周开始的每个星期四的日期,因此与本周的日期无关,只需要前26个条目 例如,如果今天是2017年6月13日星期四,那么下一个日期是 2017年6月20日 2017年6月27日 2017年8月3日等。 2017年6月9日-2017年6月15日星期日-星期六选择本周的任何一天都一样,您需要对此设置一些上限。SQL Server将不会返回无限系列。但这应该给你一个想法: declare @cnt int = 7 declare @thursdays table ( thursday

我需要得到从下周开始的每个星期四的日期,因此与本周的日期无关,只需要前26个条目

例如,如果今天是2017年6月13日星期四,那么下一个日期是

2017年6月20日 2017年6月27日 2017年8月3日等。
2017年6月9日-2017年6月15日星期日-星期六选择本周的任何一天都一样,您需要对此设置一些上限。SQL Server将不会返回无限系列。但这应该给你一个想法:

declare @cnt int = 7
declare @thursdays table
(
    thursday date 
)
while @cnt < 100
    begin
        INSERT INTO @thursdays VALUES( cast(DATEADD(dd,@cnt,getdate()) as date))
        set @cnt = @cnt + 7
    end

SELECT * FROM @thursdays
试试这个

 DECLARE @ThrusdayList TABLE (
    ID INT IDENTITY
    ,DATES DATE
    )
DECLARE @counter INT
DECLARE @Date DATE

SELECT @counter = 0

SELECT @Date = '20170713' --Add your date

WHILE @counter <= 52
BEGIN
    INSERT INTO @ThrusdayList (DATES)
    SELECT Thursday = convert(VARCHAR(11), DATEADD(WEEK, 1, @Date), 120)

    SELECT @counter = @counter + 1

    SELECT @Date = DATEADD(WEEK, 1, @Date)
END

SELECT CONVERT(VARCHAR(11),DATES,113) AS Thursdays
FROM @ThrusdayList
试试这个

-- get all dates between 2 points
declare
    @EndDate datetime

set @EndDate=DATEADD(month,6,getdate())

SELECT 
    [date]=convert(datetime, CONVERT(float,d.Seq))
FROM 
    (
    select top 100000 row_number() over(partition by 1 order by A.name) as Seq 
    from syscolumns A, syscolumns B  
    )d 
where
    convert(datetime, CONVERT(float,d.Seq))>GETDATE() and 
    convert(datetime, CONVERT(float,d.Seq))<=@EndDate and
    datename(dw,convert(datetime, CONVERT(float,d.Seq))) ='Thursday'

毫无疑问,您需要一个“结束日期”,因此添加了一个变量作为示例,但有很多方法可以做到这一点

您可以使用临时理货表生成此日期,如下所示:

Declare @date date = '2017-06-13'

Select top(26) Dates = DateAdd(day, 7*(Row_Number() over (Order by (Select Null))), @date) from
    master..spt_values s1, master..spt_values s2
另一种方法,您也可以使用递归CTE,如下所示:

Declare @date date = '2017-06-13'

;with cte_dates as (
    Select @date as Dt, 1 as Levl
    Union ALL
    Select Dateadd(day, 7, Dt) as Dt, Levl+1 as Levl from cte_dates
        where Levl < 26
)
Select * from cte_dates

使用7-datepartdw、@mydate+5查找下周的星期四,然后使用递归部分查找下一个星期四

declare @mydate datetime = dateadd(day,-4,getdate())

;with Thursdays_rte as
(
    select dateadd(day,7-datepart(dw,@mydate)+5,@mydate) thursday, 1 rn
    union all 
    select dateadd(week,1,thursday),rn+1
    from Thursdays_rte
    where rn < 26
)

select thursday,datename(dw,thursday)
from thursdays_rte

我采用了Kannan的解决方案并对其进行了修改,以确保您获得了正确的开始日期:

declare @dt date
declare @nDay int
set @dt = '07/12/17'

select @nDay =  datepart(dw,@dt)
print @nDay
IF @nDay > 5 
    SET @dt = DATEADD(day,(@nDay - 5) * -1,@dt)
else
    SET @dt = DATEADD(day, 5 -@nDay ,@dt)

--BECAUSE ROW_NUMBER STARTS AT 1 SET THIS BACK A WEEK TO GET THIS WEEK
SET @dt = DATEADD(day, -7 ,@dt)

Select top(26) Dates = DateAdd(day, 7*(Row_Number() over (Order by (Select Null))), @dt) from
    master..spt_values s1, master..spt_values s2

直到什么时候,宇宙的尽头?只需找到下一个星期四,再加上7*n天,n=1.你想要多少天我需要26个中心这只在今天是星期四时有效。这只在今天是星期四到星期六时有效,而不是在今天是星期天到星期三时有效。@Peter Hi。也许我误解了这个问题。这让他们可以在假设6个月的“结束”点的情况下获得未来所有的星期四。不,如果我们将输入日期更改为星期二,它将返回所有数据Tuesdays@Peter你检查过了吗?是的,我输入了20170711,第一个“星期四”是2017年7月18日。不是2017年7月20日星期四,如示例所示
    declare @dw int = 5; /*Thursday. put here your day of week as int*/

    with nums as /* generate 26 values */ 
    (
    select number as n
    from master..spt_values
    where type = 'p'
    and number between 0 and 25
    )
    select dateadd(day, 7 * n, start_day)
    from nums cross apply
           (
           select
                   case 
                      when datepart(dw, getdate()) <= @dw
                      then dateadd(day, @dw - datepart(dw, getdate()), cast(getdate() as date))
                      else dateadd(day, 7 +  @dw - datepart(dw, getdate()), cast(getdate() as date))
                   end as start_day /* find the first dw = @dw after today */
           )a;