【问题标题】:SQL Server Date Selection in Recordset based on initial date and number of days in another recordset记录集中的 SQL Server 日期选择基于另一个记录集中的初始日期和天数
【发布时间】:2014-11-28 19:10:03
【问题描述】:

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

为了帮助解释我想要什么,这里有一个我正在使用的视图结果集的小 sn-p:

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 是做同样事情的多种方式,我希望以最有效的方式实现这一点 :) .

就像我一开始说的,我不知道这个问题应该用适当的措辞,所以如果这是一个重复的帖子,我很抱歉。

【问题讨论】:

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


    【解决方案1】:

    你可以使用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 以及 self join 获取所需的退出日期。

    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

    【讨论】:

    • 感谢雷达的回复!这正是我想要的! :D.
    【解决方案2】:

    当你使用 TOP 子句时:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多