2010-10-03 34 views
0

經過一番研究,並從自己的小負擔,我得到這個:PHP:過濾器:從計算歲生日,BETWEEN XX和XX

 $query .= "SELECT * FROM users WHERE birthday < SUBDATE(NOW(), INTERVAL BETWEEN $min AND $max YEAR)"; 

雖然這是行不通的。

用戶生日存儲在:1991-01-01生日欄中。我的表單中有兩個字段,可以輸入數字。例如,18和22.

然後它將顯示年齡介於18和22之間的所有用戶(18,19,20,21,22) 。

^這就是我試圖過濾出來的查詢。但是,如果我做了錯誤的事情,也許你不能在INTERVAL中做BETWEEN,或者出了什麼問題?

即時得到:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BETWEEN 17 AND 21 YEAR)' at line 1 

回答

2

但香港專業教育學院做了錯事,也許你不能在間隔與做,或有什麼不好?

究竟 - BETWEEN是一個布爾運算符,這意味着它返回一個布爾值(真或假),並且INTERVAL希望的整數。

WHERE birthday 
    BETWEEN SUBDATE(NOW(), INTERVAL $max YEAR) 
     AND SUBDATE(NOW(), INTERVAL $min YEAR) 

和警告 - 你最好有這些變量正確轉義(與mysql_escape_string)。 Bobby Tables!另外請注意:使用NOW()意味着您將包括23小時前17年出生的人,但不包括18歲和1小時前出生的人。這通常不是我們所說的「生日」的意思 - 您最好使用TODAY()而不是NOW()

但是,與TODAY(),還有另一個問題:BETWEEN是包容性的;因此,在18到20之間,你沒有2年,但2年和1天。通過將BETWEEN分開並進行正常比較來克服這個問題(birthday > ... AND birthday <= ...

+0

+1好答案=)我通常從MySQL獲取值並用PHP解析它們,所以我不太擅於讓MySQL爲我解析它。 – stevendesu 2010-10-03 17:14:48

+0

我不喜歡解析日期 - 每當我提取日期時,我幾乎總是獲取'UNIX_TIMESTAMP(field)',並存儲'FROM_UNIXTIME(time)'... – Amadan 2010-10-03 17:16:52

+0

你好。好的解決方案你能否使用TODAY()展示例子,因爲我想排除更少的人。 – Karem 2010-10-03 19:36:57

0

SQL行BETWEEN只接受兩個參數。你會說BETWEEN $min AND $max,而不是BETWEEN $min AND $max YEAR

如果存儲的日期作爲MySQL的日期,而不是作爲一個INT或字符串,也有可以使用MONTH(date),,解釋只是日期的各個部分MySQL的函數等

試圖通過this MySQL reference閱讀和看看它是否可以幫助你。

0

如果這是一個選項,我會說削減雜亂和修改mysql列或創建一個列將出生日期保存爲一個整數。例如,1991年12月1日,你有它現在是19911201.這樣,你可以只使用類似:

SELECT * FROM users WHERE birthday >= min AND birthday <= max 

順便說一句:避免使用*在選擇查詢,如果可能的。

相關問題