使用postgresql函数返回日期敏感行

时间:2015-06-28 22:42:19

标签: postgresql function candlestick-chart

我正在postgresql中编写一个函数来从我拥有的一组股票数据中获取蜡烛信息。为了绘制蜡烛,我需要获得某个时间段(比如说1天)的开盘价,收盘价,最高价和最低价,所以我需要当天的开盘价,即当天的收盘价,最高值。当天的价值和当天的最低价值。

我在postgresql中创建了一个函数,以便在特定时间段内给我一个蜡烛

CREATE OR REPLACE FUNCTION getcandle(
    starttime timestamp without time zone,
    endtime timestamp without time zone,
    psymbol character varying)
RETURNS candle AS
$BODY$
select
    startTime,
    (select value as open FROM "4" WHERE datetime >= startTime and symbol = pSymbol ORDER BY datetime ASC limit 1),
    (select value as close FROM "4" WHERE datetime <= endTime and symbol = pSymbol ORDER BY datetime DESC limit 1),
    (select max(value) as high FROM "4" WHERE datetime >= startTime and datetime <= endTime and symbol = pSymbol),
    (select min(value) as low FROM "4" WHERE datetime >= startTime and datetime <= endTime and symbol = pSymbol); $BODY$
LANGUAGE sql VOLATILE

当我在特定时间运行时,我会得到类似的结果:

select * from getCandle('2015-06-26 08:30:00', '2015-06-26 08:35:00', 'AAPL')
start                |open  |close |high  |low
---------------------|------|------|------|------
"2015-06-26 08:30:00"|127.51|127.32|127.51|127.23

现在我想编写另一个选择特定时间段内所有蜡烛的函数,我称之为getCandles,这就是我迄今为止所用的大量Google搜索。

CREATE FUNCTION getCandles(startTime timestamp, endTime timestamp, pSymbol varchar, candleWidth int) RETURNS SETOF candle as $$
declare
    numberOfCandles int;
    candles candle%rowtype;
    localStart timeStamp;
    localEnd timeStamp;
begin
    numberOfCandles := (SELECT EXTRACT(EPOCH FROM (endTime - startTime))) / candleWidth;
    FOR i IN 1 .. numberOfCandles LOOP
        localStart := startTime + interval candleWidth * (i - 1) ' seconds';
        localEnd := startTime +  + interval candleWidth * i ' seconds';
        candles := getCandle(localStart, localEnd, pSymbol);
        return next candles;
    end loop;
return;
$$ language 'plpgsql';;

我最大的问题是,当我运行时,我得到了这个:

ERROR:  syntax error at or near "*"
LINE 10:    localStart := startTime + interval candleWidth * (i - i) ...
                                                       ^

********** Error **********

ERROR: syntax error at or near "*"
SQL state: 42601
Character: 414

所以我的问题如下:

1)如何使用for循环将时间范围增加x秒?

2)我是否正确地在烛台变量中添加行?

3)有没有更好的方法来做其中任何一个?

顺便说一下,我正在使用所有这些信息并使用不同的程序绘制图表。我宁愿不从帖子收集所有信息并将其发送到我的程序,因为我每天收集近10k记录,所以如果我计算7天或一个月的蜡烛,那将是一个巨大的数据请求。编写一组能够清除我需要的数据的函数似乎更好。非常感谢,Stack是一个了不起的资源,我不知道没有它我会做什么。

1 个答案:

答案 0 :(得分:0)

我明白了,对于那些遇到同样问题的人来说,这是我的固定功能。

CREATE FUNCTION getCandles(startTime timestamp, endTime timestamp, pSymbol varchar, candleWidth int) RETURNS SETOF candle as $$
declare
    numberOfCandles int;
    candles candle%rowtype;
    localStart timeStamp;
    localEnd timeStamp;
begin
    numberOfCandles := (SELECT EXTRACT(EPOCH FROM (endTime - startTime))) / candleWidth;
    FOR i IN 1 .. numberOfCandles LOOP
        localStart := startTime + (candleWidth * (i - 1) * interval '1 second');
        localEnd := startTime + (candleWidth * i * interval '1 second');
        candles := getCandle(localStart, localEnd, pSymbol);
        return next candles;
    end loop;
return;
end
$$ language plpgsql;

我的错误是翻转间隔和烛光。

相关问题