2009-11-10 34 views
15

我使用這個:MySQL的 - 從UNIX時間戳選擇一年

SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year FROM table_name WHERE year = 2009; 

,但它給了我一個錯誤:

Unknown column 'year' in 'where clause'SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year FROM table_name WHERE year = 2009 

兩個 「my_unix_timestamp_column」 和 「表格名」 是正確的,我不知道爲什麼它給了我這個!

我使用PHP 5.3.0

回答

19

我不太確定這是否是由於YEAR是在MySQL保留字,或者因爲它要你的線沿線的做一些事情:

SELECT 
    FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year 
FROM 
    table_name 
WHERE 
    FROM_UNIXTIME(my_unix_timestamp_column, '%Y') = 2009; 

不能記得我最後的問題是否僅僅是相關GROUP英格斯:S

0

你不能使用列創建的SELECT部分在WHERE條款

與實際功能,以創建替換year變量的where子句中列(又名FROM_UNIXTIME(my_unix_timestamp_column, '%Y')),你應該沒問題。

這是因爲您的查詢的SELECT部分不會執行,直到WHERE部分完成要返回的匹配行。

+0

關於'SELECT'部分的部分是錯誤的。我不會downvote你,但嘗試運行以下查詢:'SET @r:= 1; SELECT @r:= id + 1 FROM mytable WHERE @r = id'在連續ids從'1'開始的任何表上。 – Quassnoi 2009-11-10 16:14:31

0

WHERE部分在字段列表中的別名之前執行。最好的事情是在WHERE子句中使用BETWEEN,這樣就可以使用索引。

3
SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS `year` 
FROM table_name 
HAVING `year` = 2009 

不同於WHERE子句,HAVING子句可以引用SELECT子句別名。

更多指數有效的方法是:

SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS `year` 
FROM table_name 
WHERE my_unix_timestamp_column >= UNIX_TIMESTAMP('2009-01-01') 
     AND my_unix_timestamp_column < UNIX_TIMESTAMP('2010-01-01') 
+0

雖然這兩個查詢的工作,這個答案並沒有描述爲什麼都解決where子句中的'year'問題。 (兩者的構造方式都比正常條款中的年份略低一些) – Jehiah 2009-11-10 16:04:46

3

另一種選擇,避免重複一個較大的函數調用的:

SELECT year 
    FROM (SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year 
      FROM table_name) AS list_of_years 
WHERE year = 2009; 

你仍然可能需要使用「年」字繞回引號,以避免與YEAR作爲關鍵字衝突。優化器不需要創建一箇中間表來回答這個查詢。