仅返回两个时间戳范围内的行-SQL-Postgresql
我有股票交易所的时间序列数据,它只在上午9点到下午4点之间开放。我希望忽略任何超出这些界限的行 为了知道是否需要进行API调用,我正在将给定时间段的generate_序列与存储在数据库中的时间序列数据进行比较 我正在对generate_系列结果和我的av_日内表进行左联接 这是查询仅返回两个时间戳范围内的行-SQL-Postgresql,sql,postgresql,datetime,Sql,Postgresql,Datetime,我有股票交易所的时间序列数据,它只在上午9点到下午4点之间开放。我希望忽略任何超出这些界限的行 为了知道是否需要进行API调用,我正在将给定时间段的generate_序列与存储在数据库中的时间序列数据进行比较 我正在对generate_系列结果和我的av_日内表进行左联接 这是查询 SELECT * FROM generate_series(date_trunc('day', localtimestamp - interval '1 day') , loc
SELECT *
FROM generate_series(date_trunc('day', localtimestamp - interval '1 day')
, localtimestamp
, interval '15 min') g(start_time)
LEFT JOIN av_intraday av ON av.date = g.start_time
AND extract(hour from g.start_time) >= 9
AND extract(hour from g.start_time) <= 16
ORDER BY g.start_time;
数据应该如下所示
av_intraday
start_time | symbol | date | open | high | low | close | volume
---------------------+--------+---------------------+-----------+-----------+-----------+-----------+---------
2019-07-30 09:00:00 | | | | | | |
2019-07-30 09:15:00 | | | | | | |
2019-07-30 09:30:00 | | | | | | |
2019-07-30 09:45:00 | fb | 2019-07-30 09:45:00 | 194.95 | 195.83 | 194.54 | 195.58 | 2004674
2019-07-30 09:45:00 | amzn | 2019-07-30 09:45:00 | 1891.115 | 1905.3 | 1883.48 | 1904.28 | 564821
2019-07-30 09:45:00 | goog | 2019-07-30 09:45:00 | 1225.41 | 1234.87 | 1223.4301 | 1232.0699 | 203333
2019-07-30 09:45:00 | tsla | 2019-07-30 09:45:00 | 234 | 235.54 | 233.72 | 235.07 | 207546
2019-07-30 09:45:00 | aapl | 2019-07-30 09:45:00 | 208.88 | 208.93 | 208.335 | 208.6148 | 602413
...
2019-07-30 16:00:00 | amzn | 2019-07-30 16:00:00 | 1897.42 | 1899.9 | 1896.61 | 1898.33 | 152442
2019-07-30 16:00:00 | goog | 2019-07-30 16:00:00 | 1225.09 | 1226.34 | 1223.3 | 1223.4 | 169110
2019-07-30 16:00:00 | tsla | 2019-07-30 16:00:00 | 241.94 | 242.3 | 241.93 | 242.2 | 151572
2019-07-30 16:00:00 | aapl | 2019-07-30 16:00:00 | 208.94 | 208.94 | 208.3436 | 208.685 | 1096338
2019-07-30 16:15:00 | | | | | | |
2019-07-30 16:30:00 | | | | | | |
2019-07-30 16:45:00 | | | | | | |
...
通过以下操作获得了所需的结果
SELECT *
FROM (
SELECT g.start_time as g_start_time, av.symbol, av.open, av.high, av.low, av.close, av.volume
FROM generate_series(date_trunc('day', localtimestamp - interval '1 day')
, localtimestamp
, interval '15 min') g(start_time)
LEFT JOIN av_intraday av ON av.date = g.start_time
ORDER BY g.start_time
) t
WHERE extract(hour from g_start_time) >= 9
AND extract(hour from g_start_time) <= 16;
但我不知道为什么它不能像以前那样工作。有人能解释一下吗?谢谢。请您填写一下结果中的哪些栏好吗?特别是它们来自哪个表。@Schwern我添加了列名和表名以供参考。
LEFT JOIN av_intraday av ON av.date = g.start_time
AND extract(hour from g.start_time) >= 9
AND extract(hour from g.start_time) <= 16
LEFT JOIN av_intraday av ON av.date = g.start_time
AND extract(hour from g.start_time) >= 9
AND extract(hour from g.start_time) <= 16
select *
from generate_series(
date_trunc('day', localtimestamp),
localtimestamp,
interval '15 min'
) g(start_time)
left join av_intraday av
on av.date = g.start_time
where extract(hour from g.start_time) between 9 and 16
order by g.start_time;