MS Access 2016-比较同一表中的日期

问题描述 投票:-1回答:2

我有两个表,用户和作业。用户ID和作业ID都是其表的自动编号和主键。

用户表:

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

工作表:

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日,所以我需要知道比利(UID 1)在8月12日到11月15日之间的天数。另外,如果将来没有安排工作,那么理想情况下,我希望Alan的“未来”单元格为空(UID 2)。

在我的脑海中,看起来类似于下表。

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

过去,几乎所有用户都将至少拥有一份工作,但不能保证将来有任何工作。就像玛丽亚(UID 3)一样,很有可能会创建一个用户并且尚未找到他们的工作日期,但这是一个有限的场景(用户从租用到工作的时间少于30天)。

我已经尝试了几天,但仍然一无所获。也许我的代码不正确,但是我无法获得两个左连接来进行计算,因此存在计算差异的问题。

sql ms-access ms-access-2016
2个回答
0
投票

您的数据集对我来说似乎有点不清楚,所以您会在过去和将来为单个用户指定多个日期,如果是,那么您想选择哪个日期,因为如果您愿意所有这些将在输出中包含多行UID。您可以在msaccess中创建这样的查询:

SELECT tbl_User.UID, IIf([tbl_Jobs].[JDate]<Date(),[JDate],"") AS Past, IIf([tbl_Jobs].[JDate]>Date(),[JDate],"") AS Future
FROM tbl_Jobs INNER JOIN tbl_User ON tbl_Jobs.UID = tbl_User.UID;

该查询产生以下结果:

UID |   Past      | Future
1   |             |12/30/2019
1   |             |11/15/2019
1   | 8/12/2019   |
2   | 10/13/2019  | 
2   | 9/15/2019   | 
2   | 9/5/2019    | 

如果需要进一步说明,请发表评论。


0
投票

这里是一个解决方案(对于sqlserver,我将需要重新测试msaccess)-当日期等于今天时会发生什么?

-- 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

用于MSACCESS的SQL使用左右连接的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
© www.soinside.com 2019 - 2024. All rights reserved.