迄今为止,两个答案都没有捕捉到你实际的问题。
虽然显式地将类型转换为适当的类型无疑是有益的,但不是必需的。PostgreSQL会自动将字符串文字强制转换为适当的类型。
您的问题源于基本语法错误:
双引号用于标识符:"MyColumn"
- 仅在名称非法(大小写混合,保留字等)时才需要使用,应尽量避免。
单引号用于值:'string literal'
。
您可能会对PostgreSQL手册中关于标识符和常量的写作精美的章节感兴趣。
顺便说一句,永远不要使用date
或time
作为列名。这两个名字在每个SQL标准和PostgreSQL中都是保留字和类型名称。这将导致令人困惑的代码和错误消息。
我建议只使用单个timestamp
列,而不是单独的date
和time
:
而您几乎肯定不希望使用character(100)
作为数据类型,永远不要 - 尤其是对于id
列。这种填充了空格的类型基本上只是出于历史原因才存在。考虑使用text
或varchar
代替:
可能看起来像这样:
CREATE TABLE tbl (
tbl_id text CHECK(length(id) <= 100)
, ts timestamp
);
如果您只需要这些组件,请将其转换为time
或date
,这很简洁而且便宜:
SELECT ts::time AS the_time, ts::date AS the_date FROM tbl;
使用date_trunc()
或extract()
进行更具体的需求查询。
要查询...在某一天晚上10点后有时间值的id值:
SELECT *
FROM tbl
WHERE ts::time > '22:00'
AND ts::date = '2012-04-18';
或者,对于任何连续的时间段:
...
WHERE ts > '2012-04-18 22:00'::timestamp
AND ts < '2012-04-19 00:00'::timestamp
第二种形式可以更好地利用 ts
上的普通索引,在大表情况下会更快。
有关 PostgreSQL 中的 timestamp
处理的更多信息: