Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取SQL SERVER中运行的日期总数_Sql Server_Tsql - Fatal编程技术网

Sql server 获取SQL SERVER中运行的日期总数

Sql server 获取SQL SERVER中运行的日期总数,sql-server,tsql,Sql Server,Tsql,我想创建一个连续的日期列表,在上面的日期基础上增加6周。到目前为止,我的代码给了我一个开始和结束日期。我需要显示开始日期和结束日期之间的6周间隔 aLearnerRef startdate enddate reviewdate ------------------------------------------------------ 399750423600 2013-11-27 2014-06-12 2014-01-08 399750423600

我想创建一个连续的日期列表,在上面的日期基础上增加6周。到目前为止,我的代码给了我一个开始和结束日期。我需要显示开始日期和结束日期之间的6周间隔

aLearnerRef     startdate     enddate       reviewdate
------------------------------------------------------
399750423600    2013-11-27    2014-06-12    2014-01-08
399750423600    2013-11-27    2014-06-12    2014-02-19
399750423600    2013-11-27    2014-06-12    2014-04-02
399750423600    2013-11-27    2014-06-12    2014-05-14
我希望它循环,直到它到达enddate之前的最后一个日期。我想不出一个可能的办法来做这件事。以下是到目前为止我拥有的代码:

SELECT a.aLearnerRef,  x.startdate, x.enddate
FROM aims a
inner join vStudyP s
on s.LearnerRef = a.aLearnerRef
join (SELECT aLearnerRef, min(learnstartdate) startdate, max(learnplannedenddate) enddate
        FROM aims
        GROUP BY aLearnerRef) x
on a.aLearnerRef = x.aLearnerRef
group by a.aLearnerRef,  x.startdate, x.enddate
试试这个代码

with cte as
(
select ak.akid,sdate,edate,DATEADD(WEEK,6,sdate) rdate from ak
Union All

select ak.akid,ak.sdate,ak.edate,DATEADD(WEEK,6,rdate) rdate from ak
inner join cte on  rdate between ak.sdate and ak.edate 
where  DATEADD(WEEK,6,rdate) between ak.sdate and ak.edate 


)
select * from CTE
如果有多个记录

with cte as
    (
    select ak.akid,sdate,edate,DATEADD(WEEK,6,sdate) rdate from ak
    Union All

    select ak.akid,ak.sdate,ak.edate,DATEADD(WEEK,6,rdate) rdate from ak
    inner join cte on  rdate between ak.sdate and ak.edate 
    where  DATEADD(WEEK,6,rdate) between ak.sdate and ak.edate 
          and cte.akid = ak.akid

    )
    select * from CTE

演示链接,使用辅助编号表:

SELECT a.aLearnerRef,  dateadd(day,n,a.startdate), a.enddate
FROM aims a
inner join numbers num
on n < datediff(day,startdate, enddate)
选择a.aLearnerRef、dateadd(day、n、a.startdate)、a.enddate
从目标a
内连接数
在n
我认为递归CTE在这里很有用。将尝试一些代码和共享。谢谢,这很有意义。如果ak中有超过1条记录呢?那么您希望对每一条记录都遵循相同的模式吗?如果您只想将此ans用于一条记录,则可以在两条select语句中应用where子句。所以这取决于你的要求。我认为它也适用于多张唱片。仍将编辑第二个选项(&post)仅添加一个条件。如果您对ans.感到满意,请将ans.标记为有用。