不选择功能记录之间的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)
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)