在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
,并且DateFormatted
是Short 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中的保留字。
问候,