2012-09-20 56 views
0

我應該選擇7月(或07)出生的所有人。這不起作用:psql 8.4.1選擇所有在特定月份出生的人

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

ERROR: invalid input syntax for type timestamp with time zone: "07" LINE 1: ...ct * from people where date_trunc('month',dob)='07';

什麼是正確的方法是什麼?

回答

3
select * from people where to_char(dob, 'MM') = '09'; 

爲您提供九月出生的所有人,如果出生日期存儲在名爲'dob'的時間戳表列中。 第二個參數是日期格式模式。所有典型的模式都應該被支持。 例如:

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

會做同樣的事情。

here的時間戳格式圖案的Postgres:

+0

很好的鏈接。我能夠找到出生在特定年份和月份的人(YYYY-MM)。謝謝 – mamesaye

+0

@mamesaye:鏈接是過時版本8.2的手冊。將其更改爲指向版本8.4。 –

+0

@Erwin Brandstetter謝謝 –

4

to_char()是爲了格式的日期。對於像你這樣的條件,extract()簡單&更快:

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

如果你想搜索

a specific year and month too (YYYY-MM)

...好像在評論中提到,使用date_trunc()像你最初曾。只需將其與datetimestamp進行比較,而不是字符串,這沒有任何意義(並且是錯誤消息的原因)。爲了找到生於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); 

.. 。因此將用大表覈查以前查詢的性能。小桌子無關緊要。

如果需要,還可以使用functional index加速第一個查詢。

相關問題