繁体   English   中英

日历表中下一个/上一个工作日的SQL(在MS Access中)

[英]SQL for Next/Prior Business Day from Calendar table (in MS Access)

我有一个从我们的大型机数据库中提取的日历表,并保存为本地Access表。 该表的历史可以追溯到1930年代(我知道我们至少在一个地方使用了50年代的历史),结果记录为31k。 该日历表具有3个感兴趣的字段:

Bus_Dt-每天,不仅是工作日。 首要的关键
Bus_Day_Ind-指示该日期对于股市来说是否是有效的工作日。
Prir_Bus_Dt-前一个工作日。 包含一些错误(大约50个),全部为旧错误。

我已经写了一个查询来检索当前日历日或之后的第一个工作日,但运行速度极其缓慢。 (5分钟以上),我检查了showplan输出,并看到它正在通过x-join运行,它在30k +个记录表之间提供了将近1000万个解决方案空间(以及日期比较)。 但是,实际任务并不难,并且可以通过Excel在最短的时间内使用简单的排序轻松完成。

因此,我的问题是,是否有任何方法可以解决查询性能差的问题,或者这是SQL固有的故障? (在大型机上运行的DB2速度也很慢,尽管不是很慢。在问题和所有这些方面都抛出了循环。)第二,如果我信任prir_bus_dt,我能达到更好的境地吗? 还是限制日期范围(又称“作弊”),或者其他我没想到的技巧?

SQL:

SELECT TE2Clndr.BUS_DT AS Cal_Dt  
    , Min(TE2Clndr_1.BUS_DT) AS Next_Bus_Dt  
FROM TE2Clndr  
    , TE2Clndr AS TE2Clndr_1  
WHERE TE2Clndr_1.BUS_DAY_IND="Y" AND  
    TE2Clndr.BUS_DT<=[te2clndr_1].[bus_dt]  
GROUP BY TE2Clndr.BUS_DT;

展示计划:

Inputs to Query  
Table 'TE2Clndr'  
Table 'TE2Clndr'
End inputs to Query
01) Restrict rows of table TE2Clndr
       by scanning
       testing expression "TE2Clndr_1.BUS_DAY_IND="Y""
       store result in temporary table
02) Inner Join table 'TE2Clndr' to result of '01)'
       using X-Prod join
       then test expression "TE2Clndr.BUS_DT<=[te2clndr_1].[bus_dt]"
03) Group result of '02)'

再次,问题是,这是否可以做得更好(更快),或者它已经变得足够好了?

我有一个新查询,对于同一工作,它的查询要快得多,但这取决于prir_bus_dt字段(有一些错误)。 这也不是很好的理论,因为不一定每个人的日历上都提供以前的工作日。 因此,我不认为这是“答案”,而只是答案。

新查询:

SELECT TE2Clndr.BUS_DT as Cal_Dt  
    , Max(TE2Clndr_1.BUS_DT) AS Next_Bus_Dt  
FROM TE2Clndr 
INNER JOIN TE2Clndr AS TE2Clndr_1
    ON TE2Clndr.PRIR_BUS_DT = TE2Clndr_1.PRIR_BUS_DT
GROUP BY TE2Clndr.BUS_DT;

那这种方法呢

select min(bus_dt)
from te2Clndr
where bus_dt >= date()
and bus_day_ind = 'Y'

是我对代表当前日期的date()引用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM