如何在 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 会将传递的值转换为日期,而您会丢失时间信息。如果您希望将其视为一个参数,则需要将参数定义为 timestamp
。 created_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;
我是 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 程序中,我得到的数据超出了范围。
这是我的屏幕截图:
如您所见,在我的第二个屏幕截图中,我获取的数据超出了范围。我不知道哪里做错了。
您的参数声明为 DATE
,但您正试图传递 timestamp
。所以 Postgres 会将传递的值转换为日期,而您会丢失时间信息。如果您希望将其视为一个参数,则需要将参数定义为 timestamp
。 created_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;