MS Access根据开始和结束日期自动填充查询列

时间:2018-11-13 22:08:47

标签: sql ms-access access-vba ms-access-2016

我有一个名为Records Query的查询,正在使用表格输入信息。

每条记录都有一个日期。

在另一个表中,我有一个日期范围列表以及该范围的名称。也就是说,第一列是Range name,第二列是Start date,第三列是End date

我希望Records Query的最后一栏显示该特定范围所在的日期范围的名称。

例如,如果我具有以下日期范围:

+------------+----------+----------+
| Start date | End date |   Name   |
+------------+----------+----------+
| Jan 1      | Jan 10   | session1 |
| Jan 11     | Jan 20   | session2 |
+------------+----------+----------+

如果Records Query中该记录的日期为1月2日,则列Session的值应自动为session1

如果有人可以提供帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以通过简单的Where子句加入:

Select
     [Records Query].*,
     [Date Ranges].[Name] As [Session Name]
From
     [Records Query],
     [Date Ranges]
Where
     [Records Query].[Date] Between [Date Ranges].[Start date] And [Date Ranges].[End date]

答案 1 :(得分:0)

假设您的日期是使用DateTime字段存储的,并且日期范围是连续的(没有空格),则可以使用以下相关子查询为日期确定合适的会话名称:

SELECT q.*,
(
    SELECT TOP 1 r.Name 
    FROM Ranges r 
    WHERE q.MyDate <= r.[End date] ORDER BY r.[End date]
) AS SessionName
FROM [Records Query] q

在这里,我假设您的日期范围存储在名为Ranges的表中,并且您的Records Query查询中的日期字段称为MyDate(更改此值以适合您的数据)

在上面的示例中,我假设您具有以下设置:

范围

Ranges

记录查询

Records Query

SQL

SQL

结果

Result

不幸的是,您不能简单地将此子查询注入到UPDATE查询中-

UPDATE [Records Query] q
SET q.Session = 
(
    SELECT TOP 1 r.Name 
    FROM Ranges r 
    WHERE q.MyDate <= r.[End date] ORDER BY r.[End date]
)

...由于结果查询将不可更新(因为新值引用了要更新的表)。

因此,您可能需要将会话名称和主键从您的Records Query查询输出到本地表,然后该表可用于更新查询-希望其他人可能会知道一种更优雅的方式避免这种情况。