MS Access查询-如何仅基于输入日期定义日期范围

时间:2020-07-08 12:25:17

标签: sql ms-access

MS Access查询-如何仅基于输入日期定义日期范围

您好,我有一张桌子,展示了批准过程中的步骤。

ID   |OriginalID|   OraclePricelistName |Change           |ItemNumber| Modified | Approval|PCTask | OESTask
2363 |  5,529   |   price_list1         | No              | Item1    |2020-06-09| Approved|No task|No task
2352 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-09| Approved|Ready  |Ready
2332 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-09| Approved|Ready  |Pending
2325 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-08| Approved|Pending|Pending
2312 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-08| Pending |Pending|Pending
14422|  5,529   |   price_list1         |No               | Item1    |2020-01-15| Approved|No task|No task
14419|  5,529   |   price_list1         |Workflow running | Item1    |2020-01-15| Approved|Ready  |No task
14184|  5,529   |   price_list1         |Workflow running | Item1    |2020-01-14| Approved|Pending|Pending
14121|  5,529   |   price_list1         |Workflow running | Item1    |2020-01-13| Pending |Pending|Pending
11434|  5,529   |   price_list1         |No               | Item1    |2019-12-27| Approved|No task|No task

我的任务是创建一个查询,以显示工作流程的每个步骤何时完成,并根据输入的日期过滤结果。我设法创建了查询的一部分,该部分确定了每个步骤的完成日期。但是,我很难仅按输入日期指定范围。我知道每个新范围在“更改”列将其状态从“否”更改为“工作流正在运行”时开始,并在其变回“否”时结束。我尝试使用别名列并对其进行过滤而没有成功。

PARAMETERS [CheckDate] DateTime;
SELECT DISTINCT archive_prices.ID, archive_prices.OriginalID, archive_prices.OraclePricelistName, archive_prices.Change, archive_prices.ItemNumber, archive_prices.CustomerItemNumber, archive_prices.Currency, archive_prices.Modified, archive_prices.Created, archive_prices.Approval, archive_prices.CSSTask, archive_prices.PCTask, archive_prices.OESTask, archive_prices.CSTask, archive_prices.MultiYear,

IIF([Change]='Workflow running' AND [Approval]='Pending' AND [PCTask]='Pending' AND [OESTask]='Pending',[Modified],'Blank') AS UpdateDate,
 IIF([Approval]='Approved' AND [PCTask]='Pending' AND [OESTask]='Pending',[Modified],'Blank') AS ApprovalDate,
  IIF([PCTask]='Ready' AND [OESTask]='Pending',[Modified],'Blank' ) AS OracleUpdate,
    IIF([OESTask]='Ready',[Modified],'Blank') AS BacklogUpdate, 


IIF([Change]='No',[Modified],"Blank") AS CompletedTask,
 IIF([Change]='Workflow running',[Modified],"Blank") AS WorkflowTask,
  IIF([CheckDate]>=Nz([CompletedTask]),1,IIF([CheckDate]>=Nz([WorkflowTask]),1,0)) AS Range


FROM archive_prices
WHERE (((archive_prices.OraclePricelistName)=[PriceList]) AND ((archive_prices.ItemNumber)=[PartNumber]))
ORDER BY archive_prices.Modified;

如果我在CheckDate参数中输入日期06/10/2020,查询应给出以下结果:

ID  OriginalID  OraclePricelistName Change  ItemNumber  Modified    Approval    PCTask  OESTask UpdateDate  ApprovalDate    OracleUpdate    BacklogUpdate
2352    5,529   price_list1 Workflow running    Item1   2020-06-09  Approved    Ready   Ready       Null        Null         Null             2020-06-09
2332    5,529   price_list1 Workflow running    Item1   2020-06-09  Approved    Ready   Pending     Null        Null         2020-06-09       Null
2325    5,529   price_list1 Workflow running    Item1   2020-06-08  Approved    Pending Pending     Null        2020-06-08   Null             Null
2312    5,529   price_list1 Workflow running    Item1   2020-06-08  Pending Pending Pending     2020-06-08  Null         Null             Null


如果我输入日期01/10/2020,则查询应显示:

ID  OriginalID  OraclePricelistName Change  ItemNumber  Modified    Approval    PCTask  OESTask UpdateDate  ApprovalDate    OracleUpdate    BacklogUpdate
14419   5,529   price_list1 Workflow running    Item1   2020-01-15  Approved    Ready   No task     Null      Null            2020-01-15        Null
14184   5,529   price_list1 Workflow running    Item1   2020-01-14  Approved    Pending Pending     Null      2020-01-14      Null              Null
14121   5,529   price_list1 Workflow running    Item1   2020-01-13  Pending Pending Pending       2020-01-13  Null            Null              Null


我是新手,因此在这种情况下我的方法很可能是错误的,希望您能帮助我找到正确的方法。预先感谢!

1 个答案:

答案 0 :(得分:0)

由于您是新手,所以建议您按部分进行操作,如下所示:

假设ID为自动编号且为增量,则可以创建第一个名为“ Q1”的查询,例如

Select OraclePricelistName, max(ID) from archive_prices GROUP BY OraclePricelistName HAVING change = "Workflow running"

以上内容将为您提供开始更改的OraclePricelistName的最后一个ID。

然后您以以下方式进行第二次查询(“ Q2”):

Select OraclePricelistName, max(ID) from archive_prices GROUP BY OraclePricelistName HAVING change = "no"

上面将为您提供更改完成后OraclePricelistName的最后一个ID。

那你做

Select Q1.*, Q2.* from Q1 LEFT JOIN Q2 ON Q1.OraclePricelistName = Q2.OraclePricelistName

上面将显示您需要的数据。请注意,当Q2.id低于Q1.id时,表示更改已开始但尚未关闭。

相关问题