我正在尝试在postgreSQL 9.5中编写一个以日期作为参数的函数。我的表有一个名为inception_date的列,我希望函数返回表中的所有行,其中inception_date大于作为变量提供的日期。以下是我的功能:
CREATE OR REPLACE FUNCTION somefunc(date) RETURNS setof table AS
$BODY$
DECLARE variable ALIAS FOR $1;
BEGIN
RETURN QUERY SELECT * FROM table WHERE inception_date > variable;
END;
$BODY$
LANGUAGE 'plpgsql';
SELECT somefunc('2014-07-02');
我无法找到任何信息说posgreSQL函数中的日期处理方式与其他数据类型不同,但此函数不显示任何输出,而查询
SELECT * FROM table WHERE inception_date > '2014-07-02';
返回15行。有谁知道这里可能出了什么问题?
答案 0 :(得分:0)
这里是什么,你解释你的代码与PostgreSQL解析器不同。 For You'2014-07-02'是约会对象。对于解析器,这是一个srting。但他试图变得更好,当它看到你用它来过滤日期列时,它会尝试将其解释为日期。
但鉴于'2014-07-02',你的意思是2月的第七天,还是7月的第二天?他不知道(我也不知道)。所以,基本上这是你身边的错误,你不应该这样做。
我建议使用日期类型的命名参数创建函数,并将其用作日期。然后,当调用此函数,并将字符串作为参数时,我会将此字符串转为日期,告诉PostgreSQL我的意思。
以下手册的示例和参考。
CREATE OR REPLACE FUNCTION somefunc(p_date date)
RETURNS setof table
AS
$BODY$
BEGIN
RETURN QUERY SELECT * FROM table WHERE inception_date > p_date;
END;
$BODY$
LANGUAGE 'plpgsql';
SELECT somefunc(to_date('2014-07-02','YYYY-MM-DD'));
此处您可以找到有关date formatting和creating of functions的更多信息。
答案 1 :(得分:0)
我有一个使用包含日期的伪变量的“模式”。它不依赖于功能。 我喜欢为此使用WITH()CTE:
WITH myvar (enddate) AS (VALUES(to_date('2020-06-26', 'YYYY-MM-DD')))
SELECT 'Total downloaded records', sum(d.total_records) FROM download_table d
JOIN myvar m ON date(d.created) BETWEEN '2020-01-01' AND m.enddate
请注意,WITH公用表表达式包含转换为日期格式的日期。之所以需要它,是因为您需要比较日期类型而不是日期<=文本。