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" и "table_name" верны, я не знаю, почему это дает мне это.

Я использую PHP 5.3.0

Ответы

Ответ 1

Я не совсем уверен, связано ли это с тем, что 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 ings: S

Ответ 2

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

Ответ 3

Другая альтернатива, избегая повторения вызова функции biggish:

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

Вам все равно придется использовать обратные кавычки вокруг слова "год", чтобы избежать конфликтов с YEAR в качестве ключевого слова. Оптимизатору не нужно создавать промежуточную таблицу для ответа на этот запрос.

Ответ 4

Вы не можете использовать столбец, созданный в разделе SELECT в предложении WHERE

замените переменную year в предложении where с фактической функцией для создания этого столбца (aka FROM_UNIXTIME(my_unix_timestamp_column, '%Y')), и вы должны быть в порядке.

Это связано с тем, что раздел SELECT вашего запроса не выполняется до тех пор, пока раздел WHERE не завершит сопоставление строк для возврата.

Ответ 5

Часть WHERE выполняется перед сглаживанием в списке полей. Лучше всего использовать BETWEEN в предложении WHERE, чтобы можно было использовать индекс.