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