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
如果直接减去日期,则会计算出差额。但是在我的情况下,日期在变量asstartDate
和中存在endDate
,这导致了问题。
如何减去变量中包含的日期?
回答:
除错
你的函数是做可以做 很多 简单。语法错误的实际原因在这里:
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
看来您正在尝试转换startDate
为timestamp
,这是毫无意义的,因为您的参数startDate
已声明为timestamp
已经。
这也行不通。我在这里引用手册:
为避免语法歧义,“字符串”类型的语法只能用于指定简单文字常量的类型。
它 会 像这样工作:
SELECT EXTRACT(day FROM startDate - endDate)::int INTO diffDatePart;
但这仍然没有多大意义。您在谈论“日期”,但仍将参数定义为timestamp
。您 可以这样 消毒:
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
只需要一次。date
声明为适当类型的列date
。- 除非您确切知道自己在做什么,否则不要使用大小写混合的标识符。
- 从 末尾 减去 起始 数得到正数或应用绝对值运算符。 __
@
- 由于减去 日期 (相对于减去 timestamps 会产生一个
interval
)已经产生integer
,因此简化为: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_diffFROM 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$;
相同的电话。
以上是 PostgreSQL日期差异 的全部内容, 来源链接: utcz.com/qa/408836.html