2012-08-15 35 views
2

我試圖從Postgres數據庫中提取一些數據來實現生日提醒系統,但是我在查詢工作中遇到了一些麻煩。基本上,我想把所有的生日場地落在一定的一個月內的記錄。我曾嘗試以下查詢:在Postgres中提取所有年份中小於mm-dd的日期

SELECT * 
ALL persons 
WHERE EXTRACT(MONTH from birthday) >= 9 
AND EXTRACT(DAY from birthday) >= 15 
INTERSECT 
SELECT * 
ALL persons 
WHERE EXTRACT(MONTH from birthday) <= 10 
AND EXTRACT(DAY from birthday) <= 15 

查詢(在INTERSECT之前)的第一部分似乎是工作,因爲我想,但第二部分是15日之前不包括任何個月在日期。例如,如果9/20有生日,第一部分將包括它,但第二部分將排除它,因爲它在第15天之後(即使它仍然在10/15之前)。任何想法如何彌補這一點?

+0

如果您的PostgreSQL版本中有帖子,通常是個好主意。某些功能(如可寫CTE,窗口功能等)僅適用於較新的版本。 – 2012-08-15 05:29:49

回答

2

這應該工作:

SELECT * 
FROM persons 
WHERE 
    EXTRACT(MONTH FROM age(CURRENT_DATE, birthday)) = 11; -- less than one month the next birthday 

編輯:錯誤修復

+1

不錯;我曾設法錯過「年齡」,但它看起來非常方便。事實上,現在是時候重寫一些報告了。謝謝! – 2012-08-15 07:19:57

+0

謝謝!這很好,很簡潔。我以前主要使用MySQL,所以我仍然習慣於Postgres。 – Andrew 2012-08-16 22:44:53

2

此查詢輸出人員用了不到一個月的生日:

select * from persons where EXTRACT(MONTH FROM age(birthday))=0 

,如果你想與月產量生日之前和之後:

select * from persons where EXTRACT(MONTH FROM age(birthday)) in (0,11) 
+0

我喜歡'年齡'技巧,這很聰明。儘管如此,查詢並不完整。你錯過了一個'WHERE'子句。你測試過了嗎? – 2012-08-15 07:17:49

+2

@Craig:固定。 [這裏是SQLFiddle示例](http://sqlfiddle.com/#!1/d41d8/413) – valex 2012-08-15 07:23:19

+1

感謝您的編輯。不知何故,我設法想念曾經見過的SQLFiddle;當處理不同的數據庫或舊版本時,*酷*。尼斯。 – 2012-08-15 07:31:12

0

如何選擇* 2012-09-15'和2012-10-15之間的生日'

+0

這些人還沒有出生,所以你不知道他們什麼時候會有他們的生日。 – 2012-08-16 05:31:38