如何在postgreSQL函数中使用日期作为变量?

时间:2016-05-23 15:35:57

标签: sql postgresql function datetime

我正在尝试在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行。有谁知道这里可能出了什么问题?

2 个答案:

答案 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 formattingcreating 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公用表表达式包含转换为日期格式的日期。之所以需要它,是因为您需要比较日期类型而不是日期<=文本。