不选择功能记录之间的Postgres时间戳

Postgres Timestamp between not selecting records for function

Postgres 9.6

我有一个函数利用 BETWEEN 运算符来 select 在指定日期范围内创建的记录。这是我的结构和功能的例子

table

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  AND 
                ORDER BY dr.create_date DESC
            $q$        
            using _start_date, _end_date;
       return;
    END
$function$

我有一个 create_date 为 '2017-07-06 21:55:40.550468' 的记录,日志将我的参数记录为

LOG:  execute <unnamed>: 

                  SELECT * FROM test.list_date_records(, );

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

但我什么也没得到。我已经尝试将所有内容更改为纯 TIMESTAMP 并将 create_date 转换为 DATE 但似乎没有任何效果。

我确定它与我的时区有关(我是美国东部时间 - 纽约),但我无法弄清楚它对我的生活有什么影响。

我希望有人能指出我做错了什么。

提前致谢。

这里是解决方案:

示例数据:

Whosebug=# 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  AND 
                ORDER BY dr.create_date DESC
            $q$        
            using _start_date, _end_date;
       return;
    END
$function$
LANGUAGE plpgsql
SECURITY DEFINER;

执行

Whosebug=# 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)