0

我应该选择所有七月(或七月)出生的人。这不起作用:

select * from people where date_trunc('month',dob)='07';

错误:带有时区的时间戳类型的输入语法无效:“07”第 1 行:...ct * from people where date_trunc('month',dob)='07';

什么是正确的方法?

4

2 回答 2

4

to_char()旨在格式化日期。对于像您这样的情况,extract()更简单、更快:

SELECT *
FROM   people
WHERE  extract(month FROM dob) = 7;

如果你想搜索

也有特定的年份和月份(YYYY-MM)

...就像评论中提到的那样,date_trunc()像你最初一样使用。只需将其与 a dateor进行比较timestamp,而不是与字符串进行比较,这没有任何意义(并且是错误消息的原因)。要查找 1970 年 7 月出生的人:

SELECT *
FROM   people
WHERE  date_trunc('month', dob) = '1970-07-01 0:0'::timestamp;

如果性能相关,请将其重写为:

SELECT *
FROM   people
WHERE  dob >= '1970-07-01 0:0'::timestamp
AND    dob <  '1970-08-01 0:0'::timestamp;  -- note the < with the upper limit

因为这种形式可以在 上使用普通索引people.dob

CREATE INDEX people_dob_idx ON people (dob);

...因此会削弱以前使用大表查询的性能。与小桌子无关紧要。

如果需要,您还可以使用功能索引加速第一个查询。

于 2012-09-29T02:02:13.990 回答
3
select * from people where to_char(dob, 'MM') = '09';

如果出生日期存储在名为“dob”的时间戳表列中,则为您提供所有在 9 月出生的人。第二个参数是日期格式模式。应支持所有典型模式。例如:

select * from people where to_char(dob, 'MON') = 'SEP'; 

也会这样做。

在这里查看Postgres 中的时间戳格式模式:

于 2012-09-21T07:26:12.403 回答