MS Access 2016 - 比较相同 table 内的日期

MS Access 2016 - Compare dates within same table

我有两个 table,用户和工作。用户 ID 和作业 ID 都是它们的 table 的自动编号和主键。

用户table:

UID | Uname | Uphone | etc...
1   | Billy | 911    |
2   | Alan  | 119    | 
3   | Maria | 191    |

职位Table:

JID | UID   | Jtitle  | Date   | etc...
1   | 1     | PenTest | 12Aug
2   | 1     | Consult | 15Nov
3   | 2     | VulScan | 05Sep
4   | 2     | PenTest | 15Sep
5   | 1     | PenTest | 30Dec
6   | 2     | PenTest | 13Oct
7   | 3     | VulScan | 10Nov

我需要做的是获取每个 UID 的作业,并测量最近两个日期和未来下一个日期之间的天数。例如,今天是 10 月 23 日,所以我需要知道 Billy(UID 1)在 8 月 12 日到 11 月 15 日之间的天数。此外,如果将来没有安排工作,那么我希望 Alan (UID 2) 的 "future" 单元格为空。

在我看来,它看起来类似于下面的内容 table。

UID  | Past  | Future | Difference  |
1    | 12Aug | 15Nov  |  95
2    | 13Oct |        |  
3    |       | 10Nov  |  

几乎所有用户过去至少有一份工作,但不能保证将来有工作。可能会创建一个用户,但他们的工作日期尚未到来,就像 Maria (UID 3) 一样,但这将是一个有限的场景(用户从受雇到工作最有可能不到 30 天)。

几天来我一直在努力解决这个问题,但一无所获。也许我的代码不正确,但我无法计算出两个左连接,然后就是计算差异的问题。

这是一个解决方案(对于 sql 服务器,msaccess sql 更靠后)——当日期等于今天时会发生什么?

-- for testing, declare table and insert some date into it
declare @Jobs table (JID int, UID int, Jtitle varchar(50), aDate datetime);
insert into @Jobs values (1, 1, 'PenTest', '12Aug2019');
insert into @Jobs values (2, 1, 'Consult', '15Nov2019');
insert into @Jobs values (3, 2, 'VulScan', '05Sep2019');
insert into @Jobs values (4, 2, 'PenTest', '15Sep2019');
insert into @Jobs values (5, 1, 'PenTest', '30Dec2019');
insert into @Jobs values (6, 2, 'PenTest', '13Oct2019');
insert into @Jobs values (7, 3, 'VulScan', '10Nov2019');

-- FULL Join the max(Past) and the min(Future) and convert the dates.
Select 
     COALESCE(a.UID, b.UID) as UID, 
     Left(Convert(varchar, Past, 106), 6) as Past,
     LEFT(Convert(varchar, Future, 106), 6) as Future,
     DATEDIFF(day, Past, Future) as Difference  
FROM
    (Select UID, Max(aDate) as Past from @Jobs where aDate <= GETDATE() Group By UID)a
FULL JOIN
    (Select UID, Min(aDate) as Future from @Jobs where aDate > GETDATE() Group By UID) b
ON a.UID = B.UID

结果是--

UID Past    Future  Difference
1   12 Aug  15 Nov  95
2   13 Oct  NULL    NULL
3   NULL    10 Nov  NULL

SQL for MSACCESS 使用左右联接的 UNION 获得相同的结果--

Select 
     NZ(a.UID, b.UID) as UID, 
     format( aPast, "ddMMM") as Past,
     format( aFuture, "ddMMM") as Future,
     DATEDIFF("d", aPast, aFuture) as Difference  
FROM
    (Select UID, Max(aDate) as aPast from Jobs where aDate <= DATE() Group By UID)a
LEFT JOIN
    (Select UID, Min(aDate) as aFuture from Jobs where aDate > DATE() Group By UID) b
ON a.UID = B.UID

UNION

Select 
     NZ(a.UID, b.UID) as UID, 
     format( aPast, "ddMMM") as Past,
     format( aFuture, "ddMMM") as Future,
     DATEDIFF("d", aPast, aFuture) as Difference  
FROM
    (Select UID, Max(aDate) as aPast from Jobs where aDate <= DATE() Group By UID)a
RIGHT JOIN
    (Select UID, Min(aDate) as aFuture from Jobs where aDate > DATE() Group By UID) b
ON a.UID = B.UID

要同时获取 Uname,只需将上面的内容包装为子选择并将其与 User 连接起来。我必须将 UID-s 转换为整数 (Cint) 才能使其正常工作。

SELECT  u.Uname, z.*  

FROM (
Select 
     NZ(a.UID, b.UID) as UID, 
     format( aPast, "ddMMM") as Past,
     format( aFuture, "ddMMM") as Future,
     DATEDIFF("d", aPast, aFuture) as Difference  
FROM
    (Select UID, Max(aDate) as aPast from Jobs where aDate <= DATE() Group By UID)a
LEFT JOIN
    (Select UID, Min(aDate) as aFuture from Jobs where aDate > DATE() Group By UID) b
ON a.UID = B.UID

UNION

Select 
     NZ(a.UID, b.UID) as UID, 
     format( aPast, "ddMMM") as Past,
     format( aFuture, "ddMMM") as Future,
     DATEDIFF("d", aPast, aFuture) as Difference  
FROM
    (Select UID, Max(aDate) as aPast from Jobs where aDate <= DATE() Group By UID)a
RIGHT JOIN
    (Select UID, Min(aDate) as aFuture from Jobs where aDate > DATE() Group By UID) b
ON a.UID = B.UID
)  as z
Left Join [User] as u
On cint(z.UID) = cint(u.UID)

我住在奥克兰和伯克利之间,我们有很多当地的啤酒吧。