如何在列范围内显示范围之间的日期

时间:2017-12-18 20:48:08

标签: sql ms-access

我的数据格式如下:

+------------+-----------+-----------+
| Case_Number|Start_Date |End_Date   |
+------------+-----------+-----------+
|A1          | 12/1/2017 | 12/15/2017|
|A2          | 12/12/2017| 12/28/2017|

我希望使用第二个表中的值将开始和结束数据转换为列值,该表将值向下舍入到一周的开头。例如,12/1/2017将向下舍入为11/27/2017,对应于星期一。做这个转换,我希望以下列格式获取数据:

 +----------------+-----------+
 | Week Start Date|Case Number|
 +----------------+-----------+
 |11/27/2017      | A1        | 
 |12/4/2017       | A1        | 
 |12/11/2017      | A2        | 
 |12/18/2017      | A2        | 

我希望每周的第一个星期一显示案件已经生效。如果案例在任何给定的一周内关闭,我们不希望在生成的第二个表中显示该周。

1 个答案:

答案 0 :(得分:1)

如果从星期一开始的每周的帮助表也有该日期的另一列加上7天,那将是很好的,但如果没有,这应该有效:

select datatable.case_number, helper.week_date
from helper
left join datatable on datatable.end_date >= helper.week_start
   and datatable.start_date < dateadd('d',7,helper.week_start)

请注意,这个逻辑来自于可能看起来“回到前面”的日期关系

    W1       w2
s-E |        |        ignore
 s--|--------|-E
  s-|---E    |     
    s----E   |     
    | s---E  |     
    |   s----E
    |     s--|-E
    |        | s-E    ignore
      s < w2
      E >= W1

该“图片”的第一行和最后一行在W1 to w2期间没有任何参与,因此会被忽略。所有其他行确实在W1 to w2期间有一些参与,所以我们想要满足所有这些条件而不是其他条件。我们想要的所有位置s都是< w2,我们想要的所有位置E都是> W1,但是对于我们要忽略的所有行,其中一个条件是不真实的。因此,对于我们想要的所有行:s < w2 and E > W1