Mysql - 从unix时间戳中选择年份

时间:2009-11-10 15:47:53

标签: mysql select timestamp

我正在使用它:

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”和“table_name”都是正确的,我不知道为什么它给了我这个!!!

我正在使用PHP 5.3.0

5 个答案:

答案 0 :(得分:23)

我不太确定这是因为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

答案 1 :(得分:4)

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')

答案 2 :(得分: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作为关键字发生冲突。优化器不需要创建中间表来回答此查询。

答案 3 :(得分:0)

您无法使用在SELECT子句

中创建WHERE部分的列

将where子句中的year变量替换为实际函数以创建该列(又名FROM_UNIXTIME(my_unix_timestamp_column, '%Y')),你应该没问题。

这是因为在SELECT部分完成匹配行返回之前,查询的WHERE部分才会执行。

答案 4 :(得分:0)

WHERE部分在字段列表中的别名之前执行。最好的方法是在WHERE子句中使用BETWEEN,这样就可以使用索引。