Mysql - выбор года из метки времени Unix - PullRequest
15 голосов
/ 10 ноября 2009

Я использую это:

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 ]

23 голосов
/ 10 ноября 2009

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

4 голосов
/ 10 ноября 2009
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 голосов
/ 10 ноября 2009

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

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

Возможно, вам все еще придется использовать обратные кавычки вокруг слова «год», чтобы избежать конфликтов с ГОДОМ в качестве ключевого слова. Оптимизатору не нужно создавать промежуточную таблицу для ответа на этот запрос.

0 голосов
/ 10 ноября 2009

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

0 голосов
/ 10 ноября 2009

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

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

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

...