仅返回两个时间戳范围内的行-SQL-Postgresql

仅返回两个时间戳范围内的行-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

我有股票交易所的时间序列数据,它只在上午9点到下午4点之间开放。我希望忽略任何超出这些界限的行

为了知道是否需要进行API调用,我正在将给定时间段的generate_序列与存储在数据库中的时间序列数据进行比较

我正在对generate_系列结果和我的av_日内表进行左联接

这是查询

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;