2017-07-07 108 views
0

的Postgres 9.6時間戳

我有利用BETWEEN操作者選擇其中一個被指定的日期範圍內創建的記錄的功能。這是我的結構和功能

CREATE TABLE test.dated_records (
    dated_record_id int4 NOT NULL DEFAULT nextval('test.dated_record_dated_record_id_seq'::regclass), 
    create_date timestamptz NOT NULL DEFAULT now(), 
    update_date timestamptz NOT NULL DEFAULT now(), 
    CONSTRAINT dated_record_pkey PRIMARY KEY (dated_record_id), 
) 
WITH (
    OIDS=FALSE 
) ; 

函數的例子

CREATE OR REPLACE FUNCTION test.list_date_records(_start_date timestamp with time zone, _end_date timestamp with time zone,) 
RETURNS TABLE(dated_record_id integer, create_date timestamptz,update_date timestamptz) 
LANGUAGE plpgsql 
AS $function$ 
    BEGIN 
     return QUERY EXECUTE 
      $q$ 
       SELECT    
        dr.dated_record_id, 
        dr.create_date, 
        dr.update_date 
       FROM test.dated_records dr 
       WHERE dr.create_date BETWEEN $1 AND $2 
       ORDER BY dr.create_date DESC 
      $q$   
      using _start_date, _end_date; 
     return; 
    END 
$function$ 

我有一個紀錄的'2017-07-06 21:55:40.550468'一個CREATE_DATE和日誌記錄我的參數

LOG: execute <unnamed>: 

        SELECT * FROM test.list_date_records($1, $2); 

DETAIL: parameters: $1 = '2017-06-08 00:00:00', $2 = '2017-07-06 23:59:59' 

但我沒有得到任何回報。我試着改變一切,以簡單的TIMESTAMP和鑄造create_date到DATE,但似乎沒有任何工作。

我確定它與我的時區有關(我是美國東部時間 - 紐約),但我無法弄清楚它對我的生活是什麼。

我希望有人能指出我做錯了什麼。

在此先感謝。

回答

1

這裏的解決方案:

樣本數據:

stackoverflow=# select * from test.dated_records ; 

dated_record_id |  create_date  |   update_date  
--------------------+--------------------+--------------------------------   
1 | 2017-06-08 00:00:00+07 | 2017-07-07 10:41:43.755836+07 
2 | 2017-07-06 23:59:59+07 | 2017-07-07 10:41:43.828373+07 
3 | 2017-08-06 23:59:59+07 | 2017-07-07 10:41:43.840404+07  
4 | 2017-09-06 23:59:59+07 | 2017-07-07 10:41:43.851223+07 

(4 rows) 

功能

CREATE OR REPLACE FUNCTION test.list_date_records(_start_date timestamp with time zone, _end_date timestamp with time zone) 
RETURNS TABLE (
dated_record_id integer, -- same as selected column datatype 
create_date timestamptz, -- same as selected column datatype 
update_date timestamptz -- same as selected column datatype 
) 
AS $function$ 
BEGIN 
     return QUERY EXECUTE 
      $q$ 
       SELECT    
        dr.dated_record_id, 
        dr.create_date, 
        dr.update_date 
       FROM test.dated_records dr 
       WHERE dr.create_date BETWEEN $1 AND $2 
       ORDER BY dr.create_date DESC 
      $q$   
      using _start_date, _end_date; 
     return; 
    END 
$function$ 
LANGUAGE plpgsql 
SECURITY DEFINER; 

執行

stackoverflow=# SELECT * FROM test.list_date_records('2017-06-08 00:00:00', '2017-07-06 23:59:59'); 
dated_record_id |  create_date  |   update_date   
-----------------+------------------------+------------------------------- 
       2 | 2017-07-06 23:59:59+07 | 2017-07-07 10:41:43.828373+07 
       1 | 2017-06-08 00:00:00+07 | 2017-07-07 10:41:43.755836+07 
(2 rows) 
+0

請給予好評,並標記爲答案這個答案可以幫助你。如果你不明白,我們可以在評論部分討論更多。謝謝 :) –