PostgreSQL日期差异
我有一个PostgreSQL函数来计算日期差异:
CREATE OR REPLACE FUNCTION testDateDiff () RETURNS int AS $BODY$ DECLARE startDate TIMESTAMP; DECLARE endDate TIMESTAMP; DECLARE diffDatePart int ; BEGIN Select evt_start_date From events Where evt_id = 5 INTO startDate ; Select evt_start_date From events Where evt_id = 6 INTO endDate ; SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart; RETURN diffDatePart; END; $BODY$ LANGUAGE plpgsql COST 100 如果直接减去日期,则计算差异.但在我的情况下,日期在变量中出现为startDate和endDate,这会导致问题. 如何减去变量中包含的日期?
调试
你的功能可以做得更简单.语法错误的实际原因如下: SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart; 看起来你正在尝试将startDate强制转换为时间戳,这开始时是无意义的,因为你的参数startDate已经被声明为timestamp. 它也行不通.我引用the manual here:
它会像这样工作: SELECT EXTRACT(day FROM startDate - endDate)::int INTO diffDatePart; 但这仍然没有多大意义.您正在谈论“日期”,但仍将参数定义为时间戳.你可以清理你喜欢的东西: CREATE OR REPLACE FUNCTION f_date_diff() RETURNS int AS $BODY$ DECLARE start_date date; end_date date; date_diff int; BEGIN SELECT evt_start_date FROM events WHERE evt_id = 5 INTO start_date; SELECT evt_start_date FROM events WHERE evt_id = 6 INTO end_date; date_diff := (endDate - startDate); RETURN date_diff; END $BODY$LANGUAGE plpgsql; > DECLARE只需要一次. SELECT (startDate - endDate) INTO diffDatePart; 或者更简单的plpgsql赋值: diffDatePart := (startDate - endDate); 简单的查询 您可以使用简单查询解决简单任务 – 使用子查询: SELECT (SELECT evt_start_date FROM events WHERE evt_id = 6) - evt_start_date AS date_diff FROM events WHERE evt_id = 5; 或者你可以CROSS JOIN基表到自己(每个实例1行,所以没关系): SELECT e.evt_start_date - s.evt_start_date AS date_diff FROM events e,events s WHERE e.evt_id = 6 AND s.evt_id = 5; SQL函数 如果您坚持使用函数,请使用简单的sql函数: CREATE OR REPLACE FUNCTION f_date_diff(_start_id int,_end_id int) RETURNS int LANGUAGE sql AS $func$ SELECT e.evt_start_date - s.evt_start_date FROM events s,events e WHERE s.evt_id = $1 AND e.evt_id = $2 $func$; 呼叫: SELECT f_date_diff(5,6); PL / pgSQL函数 如果你坚持使用plpgsql … CREATE OR REPLACE FUNCTION f_date_diff(_start_id int,_end_id int) RETURNS int LANGUAGE plpgsql AS $func$ BEGIN RETURN (SELECT evt_start_date - (SELECT evt_start_date FROM events WHERE evt_id = _start_id) FROM events WHERE evt_id = _end_id); END $func$; 同样的电话. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |