如何在 PostgreSQL 存储函数中使用日期范围?

How to use the date range in PostgreSQL stored function?

我是 SQL 的新手。我正在使用 PostgreSQL。我创建了名为 report:

的存储函数
  CREATE OR REPLACE FUNCTION report(sensors VARCHAR,fromdate DATE,todate DATE) 
    RETURNS TABLE (
        sensor VARCHAR,
        id INT,
        value INT,
        created_date DATE
) 
AS $$
DECLARE 
    var_r record;
BEGIN
    FOR var_r IN(SELECT 
                        *
                FROM probe_data 
                WHERE probe_data.sensor =sensors AND probe_data.created_date >= fromdate AND  probe_data.created_date <=  todate )  
    LOOP
        sensor := var_r.sensor ; 
        id := var_r.id;
        created_date := var_r.created_date;
        value:= var_r.value;
        RETURN NEXT;
    END LOOP;
END; 

我想获取两个日期之间的数据 ranges.When 我在 SQL 工具中执行,它 returns 我想要的输出。但是当我调用函数时

 let sql=  `select * from public.report(,,);`
 let values=[req.body.sensors,req.body.fromdates,req.body.todates];

从我的 nodejs 程序中,我得到的数据超出了范围。

这是我的屏幕截图:

This is the structure of my return table

如您所见,在我的第二个屏幕截图中,我获取的数据超出了范围。我不知道哪里做错了。

您的参数声明为 DATE,但您正试图传递 timestamp。所以 Postgres 会将传递的值转换为日期,而您会丢失时间信息。如果您希望将其视为一个参数,则需要将参数定义为 timestampcreated_at 的 return 类型也应该是 timestamp

您还可以摆脱 CURSOR 循环和 PL/pgSQL:

CREATE OR REPLACE FUNCTION report(sensors VARCHAR, fromdate timestamp, todate timestamp) 
    RETURNS TABLE (sensor VARCHAR, id INT, value INT, created_date timestamp) 
AS $$
  select pb.sensor, pb.id, pb.value, pg.created_date
  FROM probe_data 
  WHERE pb.sensor = sensors 
    AND pb.created_date >= fromdate 
    AND pb.created_date <= todate;
$$
language sql;