Sql server 从sql server当前日期的下周开始,获取每个星期四的26个日期
我需要得到从下周开始的每个星期四的日期,因此与本周的日期无关,只需要前26个条目 例如,如果今天是2017年6月13日星期四,那么下一个日期是 2017年6月20日 2017年6月27日 2017年8月3日等。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
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;