【问题标题】:MS Access automatically fill Query column based on start and end dateMS Access 根据开始和结束日期自动填充查询列
【发布时间】:2019-04-16 19:57:22
【问题描述】:

我有一个名为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

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

【问题讨论】:

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


    【解决方案1】:

    假设您的日期是使用 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(更改此字段以适合您的数据)。

    在上面的例子中,我假设你有以下设置:

    范围

    记录查询

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

    ...因为结果查询将不可更新(因为新值引用正在更新的表)。

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

    【讨论】:

    • 由于某种原因,它仍然没有在会话列中说出会话名称
    • @Allan 你是说我第一条SQL语句的SessionName字段是空的吗?
    • 是的。真的不知道为什么,我检查了两次和三次以确保我没有犯错
    • @Allan 您是否按照说明将我的代码中的MyDate 更改为Records Query 中您的日期字段的名称?
    【解决方案2】:

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

    【讨论】:

    • 对不起,我有点新。我在哪里输入这个
    • 打开一个新查询,切换到 SQL 视图,粘贴代码。当然,将表/查询和字段的名称更改为您的名称。
    • 我试过了,但是 Session Name 列中的值并没有说会话名称。它唯一做的就是根据上次会话过滤记录
    • 那么您可能输入了错误的内容和/或日期仅适合该会话。我们既没有您的数据,也没有您的查询,因此不容易更具体。