2009-11-10 33 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作为关键字冲突。优化器不需要创建一个中间表来回答这个查询。