PostgreSQL 9.3:只检查时间戳的时间

时间:2015-04-02 11:17:06

标签: postgresql timestamp postgresql-9.3

我的下表中有一个timestamp类型的字段。

Create table Test_Timestamp
(
    ColumnA timestamp
);

现在插入一些记录进行演示:

INSERT INTO Test_Timestamp VALUES('1900-01-01 01:21:15'),
                 ('1900-01-01 02:11:25'),
                 ('1900-01-01 12:52:10'),
                 ('1900-01-01 03:20:05');

现在我创建了函数Function_Test,其中包含两个参数St_timeEn_Time 属于varchar类型,其中我只传递time 00:00:01。在那个功能之后 使用两个时间参数的条件返回表。

CREATE OR REPLACE FUNCTION Function_Test
(
    St_Time varchar,
    En_Time varchar
)

RETURNS TABLE
(
    columX timestamp
)
AS

$BODY$

Declare
    sql varchar;
    wher varchar;

BEGIN

    wher := 'Where columna BETWEEN '|| to_char(cast(St_Time as time),'''HH24:MI:SS''') ||' AND  '|| to_char(cast(En_Time as time),'''HH24:MI:SS''') ||'';

    RAISE INFO '%',wher;

    sql := 'SELECT * FROM Test_Timestamp ' || wher ;

    RAISE INFO '%',sql;

    RETURN QUERY EXECUTE sql;

END;

$BODY$

LANGUAGE PLPGSQL;

---调用函数

SELECT * FROM Function_Test('00:00:00','23:59:59');

但是收到错误:

ERROR:  invalid input syntax for type timestamp: "00:00:01"
LINE 1: ...ELECT * FROM Test_Timestamp where ColumnA BETWEEN '00:00:01'...  

2 个答案:

答案 0 :(得分:2)

您可以将列投射到时间:ColumnA::time

您还应该将时间(或日期或时间戳)作为varchar传递。并且您不需要动态SQL或PL / pgSQL函数:

CREATE OR REPLACE FUNCTION Function_Test(St_Time time, en_Time time)
RETURNS TABLE (columX timestamp)
AS
$BODY$
    SELECT * 
    FROM Test_Timestamp 
    where columna::time between st_time and en_time;
$BODY$
LANGUAGE sql;

这样称呼:

select *
from Function_Test(time '03:00:00', time '21:10:42');

答案 1 :(得分:0)