我有一个工作查询,运行时间太长。它用于填充Access表单字段,其中包含按开始日期排序的不同合同列表。
以下查询返回合约开始日期(DELSTART)大于或等于当前日期(PRICEDATE)的多种商品(共享合约开始日期)的不同合约开始日期列表。
函数returndelivery返回转换为double的合约的date属性,函数returnnumericdate只返回日期的一个double(yyyymmdd)。
SELECT DISTINCT (tblFuturesPrices.Period),
returnnumericdate(returndelivery([PERIOD],"S")) AS DELSTART,
ReturnNumericDate(Date()) AS PRICEDATE
FROM tblFuturesPrices
WHERE returnnumericdate(returndelivery([PERIOD],"S")) >= ReturnNumericDate(Date())
GROUP BY PERIOD
ORDER BY returnnumericdate(returndelivery([PERIOD],"S"));
理想情况下,我想在where子句中引用变量DELSTART和PRICEDATE,但是当我这样做时,Access会提示变量值。我认为查询需要的时间比它应该的长,因为我不得不多次使用我的用户定义函数。
源表(tblFutures)包含每个商品/合约的价格,可以追溯到6个月的工作日。
提前致谢。
答案 0 :(得分:0)
我认为查询需要更长的时间,因为我不得不这样做 多次使用我的用户定义函数。
就是这样。但是你可以减少这些功能:
returnnumericdate(returndelivery([PERIOD],"S")) >= ReturnNumericDate(Date())
与
没有什么不同returndelivery([PERIOD],"S") >= Date()
不知道 returndelivery 做了什么。
<强>附录强>:
过滤原始数据并创建一个与 returndelivery 相同的新函数 returndeliverydate ,但返回Date值:
SELECT
tblFuturesPrices.Period,
returndeliverydate([PERIOD],"S") AS DELSTART,
Date() AS PRICEDATE
FROM
tblFuturesPrices
WHERE
returndeliverydate([PERIOD],"S") >= Date()
保存此查询并将其用作新查询中的来源:
Select Distinct
DELSTART,
PRICEDATE
FROM
YourQuery