查询周末和月末数据



在Access数据库中,如果我有一些格式的股票数据

DateFormatted      DateSeconds        CodeName       Close     
2000-01-01          946684800          AAA           1.01
2000-01-02          946771200          AAA           1.02
2000-01-03          946857600          AAA           1.03
2000-01-04          946944000          AAA           1.04
2000-01-05          947030400          AAA           1.05
2000-01-08          947289600          AAA           1.06
.
.
.

请注意,它从05变为08,并且DateFormattedShort Text,而不是Date。考虑到连续日期格式,在WHERE子句中基于特定日期查询月底(01-31(似乎几乎是不可能的。相反,我希望,由于数据库中可能不存在这些值(由于周末、公共假日、系统错误等原因(,这意味着周末可能在周四结束,周开始可能在周二开始,月结束可能在月最后一天前3天,等等,因此有一种已知的方法可以在查询中获取这些数据。这怎么可能呢?

注意,在上面的例子中,周末将是1.05,月底(如果你继续每天+0.01的趋势(将是1.31

如果你想要每个月数据中的最后一行,你可以使用一个相关的子查询:

select s.*
from stocks as s
where s.date = (select max(s2.date)
from stocks as s2
where s2.code = s.code and
year(s2.date) = year(s.date) and
month(s2.date) = month(s.date)
);

您可以使用datepart()在数周内执行类似的操作。

您想要得到的是周/月结束日期之前的最后一个股票价值。所以,在每种情况下,你都需要找到这是什么日期。在周末的情况下,它将是:

DateAdd("d",5-Weekday(StockDate,6),StockDate)

对于月底,它将是:

DateSerial(Year(StockDate),Month(StockDate)+1,-1) 

然后,您可以在查询中使用这两个结果来获取所选日期之前的值:

SELECT DISTINCT 
S.StockCode, 
DateAdd("d",5-Weekday(S.StockDate,6),S.StockDate) AS WeekEnding,
(SELECT TOP 1 S1.StockClose FROM tblStock AS S1 WHERE S.StockCode=S1.StockCode AND S1.StockDate<=DateAdd("d",5-Weekday(S.StockDate,6),S.StockDate) ORDER BY S1.StockDate DESC) AS WeekClose
FROM tblStock AS S

SELECT DISTINCT 
S.StockCode, 
DateSerial(Year(S.StockDate),Month(S.StockDate)+1,-1) AS MonthEnding,
(SELECT TOP 1 S1.StockClose FROM tblStock AS S1 WHERE S.StockCode=S1.StockCode AND S1.StockDate<=DateSerial(Year(S.StockDate),Month(S.StockDate)+1,-1) ORDER BY S1.StockDate DESC) AS MonthClose
FROM tblStock AS S;

请注意,我已经重命名了您的字段,因为Date是Access中的保留字。

问候,

相关内容

  • 没有找到相关文章