如何在Access数据库中查询非连续日期下的周末及月末有效股票数据
解决Access非连续股票数据的周末/月末节点查询方案
核心思路
不用匹配标准的周末、月末日历日期,直接按时间周期分组,取每个周期内最晚的交易日数据即可,刚好匹配你需要的「周期内最后一个有效交易日收盘价」需求。而且你表里有DateSecondsUnix时间戳字段,无需转换文本日期就能直接做大小比较,效率更高。
具体实现方法
1. 基础准备(可选:文本日期转日期类型)
如果需要基于日期做更复杂的计算,可以先把DateFormatted短文本转为Access日期类型:
CDate(DateFormatted) AS TradeDate
2. 查询所有股票各周最后一个交易日的收盘价
这里默认周起始为周一,若需调整周起始规则,修改DatePart的第三个参数即可:
SELECT t.* FROM 股票表 t INNER JOIN ( SELECT CodeName, DatePart("yyyy", CDate(DateFormatted)) AS TradeYear, DatePart("ww", CDate(DateFormatted), vbMonday) AS TradeWeek, MAX(DateSeconds) AS MaxWeekSecond FROM 股票表 GROUP BY CodeName, DatePart("yyyy", CDate(DateFormatted)), DatePart("ww", CDate(DateFormatted), vbMonday) ) AS week_max ON t.CodeName = week_max.CodeName AND t.DateSeconds = week_max.MaxWeekSecond;
你提供的示例中,2000年1月第一周返回的就是DateSeconds为947030400、收盘价为1.05的记录,和预期结果一致。
3. 查询所有股票各月最后一个交易日的收盘价
SELECT t.* FROM 股票表 t INNER JOIN ( SELECT CodeName, DatePart("yyyy", CDate(DateFormatted)) AS TradeYear, DatePart("m", CDate(DateFormatted)) AS TradeMonth, MAX(DateSeconds) AS MaxMonthSecond FROM 股票表 GROUP BY CodeName, DatePart("yyyy", CDate(DateFormatted)), DatePart("m", CDate(DateFormatted)) ) AS month_max ON t.CodeName = month_max.CodeName AND t.DateSeconds = month_max.MaxMonthSecond;
4. 单只股票单个周期的快速查询
如果只需查某只股票指定月/周的收盘价,直接取最大时间戳对应的记录即可,无需分组:
-- 查询AAA股票2000年1月最后一个交易日的收盘价 SELECT TOP 1 Close FROM 股票表 WHERE CodeName = 'AAA' AND DatePart("yyyy", CDate(DateFormatted)) = 2000 AND DatePart("m", CDate(DateFormatted)) = 1 ORDER BY DateSeconds DESC;
注意事项
- 如果确认
DateFormatted的格式统一为yyyy-mm-dd,文本转日期的步骤不会出错,若存在格式不一致的情况,优先用DateSeconds字段做时间排序逻辑即可 - Access的
DatePart周计算规则可以通过第三个参数自定义,可选值包括vbSunday(周日为周首日,默认)、vbMonday(周一为周首日)等,可根据你的统计规则调整
内容的提问来源于stack exchange,提问作者asjhdbashjdbasjhdbhjb
相关产品推荐
相关产品推荐

