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

MS Access automatically fill Query column based on start and end date

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

每条记录都有日期。

在另一个 table 中,我有一个带有范围名称的日期范围列表。这意味着第一列是 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

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

假设您的日期是使用 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 的 table 中,并且 Records Query 查询中的日期字段称为 MyDate(更改这适合您的数据)。

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

范围

记录查询

SQL

结果

不幸的是,您不能简单地将此子查询注入 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]
)

...因为生成的查询将不可更新(因为新值引用正在更新的 table)。

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

您可以通过一个简单的 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]