Recordset中的SQL Server日期选择基于另一个记录集中的初始日期和天数

时间:2014-11-28 19:10:03

标签: sql sql-server sql-server-2008 datetime resultset

我要问的是,我在这里的论坛帖子中遇到了困难,所以任何帮助都将不胜感激! :)

为了帮助解释我想要的内容,这里有一个我正在使用的视图结果集的小片段:

CalendarDate:             WorkDay:

2014-10-03 00:00:00.000      1      
2014-10-02 00:00:00.000      1
2014-10-01 00:00:00.000      1
2014-09-30 00:00:00.000      1
2014-09-29 00:00:00.000      1
2014-09-26 00:00:00.000      1
2014-09-25 00:00:00.000      1

此视图代表我们数据库中的一个表,用于跟踪公司的实际工作日;这种观点排除了任何非工作日(因此都是“1”)。

我要做的是从另一个结果集中获取日期时间值,在此结果集中找到它并倒数天数(基于从另一个结果集中引入的值) )。所以,如果我从2014年10月3日开始,我回去的天数是5,我想在2014年9月26日结束。

就个人而言,我看到这是在预先排序的视图上以唯一记录计数完成的,但SQL是一个多样化的方法来做同样的事情,我想以最有效的方式实现这一点:)

就像我刚开始说的那样,我不知道这个问题应该措辞得当,所以如果这是一个重复的帖子,那么我道歉。

2 个答案:

答案 0 :(得分:2)

您可以使用row_number分析函数,然后导出天数差异

假设你的第二个结果集是这样的

create table Table2
( StartDate datetime,
  days int
 );

insert into Table2 values ('2014-10-03', 5);
insert into Table2 values ('2014-10-02', 5);

您可以使用此结果集加入当前表,并使用cte和row_number以及自联接获取所需的输出日期。

with cte 
as
(
select CalendarDate, row_number() over ( order by CalendarDate desc) as rn, WorkDay
from Table1 
)
select T1.StartDate, T1.days, T2.CalendarDate as OutDate from 
cte
join Table2 T1
on cte.calendarDate = T1.StartDate
join cte T2
on T2.rn - cte.rn = T1.days

结果会像

一样出现
STARTDATE         DAYS   OUTDATE
October, 03 2014    5   September, 26 2014 
October, 02 2014    5   September, 25 2014 

SQL FIDDLE

答案 1 :(得分:2)

当你使用TOP-Clause时:

SELECT TOP 1 CalendarDate
FROM (SELECT TOP 5 CalendarDate
      FROM DateTable
      WHERE CalendarDate <'2014-10-03'
      ORDER BY CalendarDate DESC
     ) AS T5
ORDER BY CalendarDate ASC