首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取最近N个交易日的sql查询,不包括周末和节假日

获取最近N个交易日的sql查询,不包括周末和节假日
EN

Stack Overflow用户
提问于 2012-03-27 08:42:05
回答 2查看 1.4K关注 0票数 1

我将每日股票数据存储在一个表中,我希望能够查询类似于“过去5个交易日的数据是什么”之类的内容。问题是,我没有周末或节假日的数据,这使得我无法计算天数。

从其他类似的问题中,我看到一些人有一个假日表来存储假日,但我希望避免这种情况,因为我知道如果没有数据,那么那一天就是周末或假日。

我认为我能做到这一点的唯一方法是首先运行一个初始查询,该查询按顺序枚举每个交易日,然后我可以以这种方式运行查询,但我希望可能有更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-27 08:44:53

有一个“天数表”,表中每一天都有一行,并有一列指定是否是交易日。真的没有理由反对这个解决方案,它已经被多次证明是有效和正确的。不要试图智胜这个简单的解决方案,你只会给自己带来痛苦。

票数 3
EN

Stack Overflow用户

发布于 2012-03-27 19:48:44

你最好的选择是使用DENSE_RANK选项,在交易日排名。下面的例子假设你使用的是SQL2008。

代码语言:javascript
运行
复制
CREATE TABLE #test (id INT IDENTITY(1, 1), trading_date DATETIME, stock_key INT, stock_count INT)

;WITH dates AS(SELECT DISTINCT DENSE_RANK() OVER (ORDER BY CAST(trading_date AS DATE) DESC) AS days_ago, 
        CAST(trading_date AS DATE) AS trading_date FROM #test)
SELECT t.* FROM #test t, dates d
WHERE d.days_ago = 5 AND t.trading_date >= d.trading_date

公用表表达式是严格必需的,但为了使其更具可读性,我将其格式化为这样的格式。如果您使用的是SQL2005,则需要将强制转换更改为

代码语言:javascript
运行
复制
CAST(FLOOR(CAST(trading_date AS FLOAT)) AS DATETIME)

仅检索datetime字段的日期部分。当然,如果您使用的是2008,并且您一开始就有一个日期字段类型,那么您可以完全取消强制转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9881863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档