2017-07-07 41 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

请给予好评,并标记为答案这个答案可以帮助你。如果你不明白,我们可以在评论部分讨论更多。谢谢 :) –