我正在尝试使用tstzrange查询postgresql(v 9.3.6)表,以确定定义为
的表中是否存在给定的时间戳CREATE TABLE sensor(
id serial,
hostname varchar(64) NOT NULL,
ip varchar(15) NOT NULL,
period tstzrange NOT NULL,
PRIMARY KEY(id),
EXCLUDE USING gist (hostname WITH =, period with &&)
);
我正在使用psycopg2,当我尝试查询时:
sql = "SELECT id FROM sensor WHERE %s <@ period;"
cursor.execute(sql,(isotimestamp,))
我收到错误
psycopg2.DataError: malformed range literal:
...
DETAIL: Missing left parenthesis or bracket.
我尝试过各种类型的铸件无济于事。
我使用以下查询管理了一种解决方法:
sql = "SELECT * FROM sensor WHERE %s BETWEEN lower(period) AND upper(period);"
但想知道为什么我对范围运算符有问题。是我的代码还是psycopg2还是什么?
感谢任何帮助。
编辑1: 为了回应这些评论,我在postgresql中的一个简单的1行表中尝试了相同的查询,如下所示
=> select * from sensor;
session_id | hostname | ip | period
------------+----------+-----------+-------------------------------------------------------------------
1 | bob | 127.0.0.1 | ["2015-02-08 19:26:42.032637+00","2015-02-08 19:27:28.562341+00")
(1行)
现在使用&#34; @&gt;&#34;运算符我收到以下错误:
=> select * from sensor where period @> '2015-02-08 19:26:43.04+00';
ERROR: malformed range literal: "2015-02-08 19:26:43.04+00"
LINE 1: select * from sensor where period @> '2015-02-08 19:26:42.03...
这似乎与psycopg2错误相同,错误的范围字面值,所以我想我会尝试类型转换为时间戳,如下所示
=> select * from sensor where sensor.period @> '2015-02-08 19:26:42.032637+00'::timestamptz;
session_id | hostname | ip | period
------------ + ---------- + ----------- + ----------- -------------------------------------------------- ------ 1 |野蛮| 127.0.0.1 | [&#34; 2015-02-08 19:26:42.032637 + 00&#34;,&#34; 2015-02-08 19:27:28.562341 + 00&#34;)
所以看来这是我的错误,字面必须是类型转换或者假设它是一个范围。使用psycopg2,可以使用以下命令执行查询:
sql="select * from sensor where period @> %s::timestamptz"