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)
我住在奥克兰和伯克利之间,我们有很多当地的啤酒吧。
我有两个 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)
我住在奥克兰和伯克利之间,我们有很多当地的啤酒吧。