我应该选择所有七月(或七月)出生的人。这不起作用:
select * from people where date_trunc('month',dob)='07';
错误:带有时区的时间戳类型的输入语法无效:“07”第 1 行:...ct * from people where date_trunc('month',dob)='07';
什么是正确的方法?
我应该选择所有七月(或七月)出生的人。这不起作用:
select * from people where date_trunc('month',dob)='07';
错误:带有时区的时间戳类型的输入语法无效:“07”第 1 行:...ct * from people where date_trunc('month',dob)='07';
什么是正确的方法?
to_char()
旨在格式化日期。对于像您这样的情况,extract()
更简单、更快:
SELECT *
FROM people
WHERE extract(month FROM dob) = 7;
如果你想搜索
也有特定的年份和月份(YYYY-MM)
...就像评论中提到的那样,date_trunc()
像你最初一样使用。只需将其与 a date
or进行比较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);
...因此会削弱以前使用大表查询的性能。与小桌子无关紧要。
如果需要,您还可以使用功能索引加速第一个查询。
select * from people where to_char(dob, 'MM') = '09';
如果出生日期存储在名为“dob”的时间戳表列中,则为您提供所有在 9 月出生的人。第二个参数是日期格式模式。应支持所有典型模式。例如:
select * from people where to_char(dob, 'MON') = 'SEP';
也会这样做。
在这里查看Postgres 中的时间戳格式模式: