到目前为止,这两个答案都没有捕捉到您的实际问题。
虽然显式强制转换为适当的类型肯定不会有什么坏处,但也没有必要。PostgreSQL 自动将字符串文字强制转换为适当的类型。
您的问题源于基本语法错误:
双引号用于标识符:"MyColumn"
- 并且仅对其他非法标识符(混合大小写,保留字,..)是必需的,应该避免开始。
单引号用于值: 'string literal'
。
您可能对PostgreSQL 手册中关于标识符和常量的精心编写的章节感兴趣。
当我们这样做时,永远不要使用date
ortime
作为列名。两者都是每个 SQL 标准中的保留字和 PostgreSQL 中的类型名称。这将导致混淆代码和错误消息。
我建议只使用单个timestamp
列而不是单独的date
and :而且您几乎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 pm 的 ... 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
更好地使用普通索引,并且在这种情况下对于大表会更快。
timestamp
有关在 PostgreSQL 中处理的更多信息: