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, чтобы можно было использовать индекс.