2015-04-02 51 views
1

我有下表,其中一個字段的類型爲timestampPostgreSQL 9.3:只檢查時間戳

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類型的,我在其中只通過time00: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

爲什麼當你需要一個varchar時間?將時間戳記轉換爲時間數據類型,並獲取時間戳的時間部分。看起來你讓事情變得複雜。 – 2015-04-02 11:34:10

+0

@FrankHeikens,正好!非常感謝。 – MAK 2015-04-02 11:38:12

回答

1

,就可以把列時間: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'); 
+0

非常感謝。 – MAK 2015-04-02 11:38:36