2009-11-10 4 views
15

J'utilise ceci:Mysql - année la sélection d'un timestamp unix

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

mais il me donne une erreur:

Unknown column 'year' in 'where clause'SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year FROM table_name WHERE year = 2009 

deux "my_unix_timestamp_column" et "nom_table" sont corrects, je ne sais pourquoi ça me donne ça !!!

J'utilise PHP 5.3.0

Répondre

19

Je ne suis pas sûr que cela est dû à YEAR être un mot réservé dans MySQL ou parce qu'il veut vous faire quelque chose le long des lignes de:

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

ne me souviens pas si le dernier numéro ne concerne que GROUP Ings: S

0

Vous ne pouvez pas utiliser une colonne créé la section SELECT dans votre WHERE clause

remplacer la variable year dans votre clause where avec la fonction réelle pour créer ce colonne (aka FROM_UNIXTIME(my_unix_timestamp_column, '%Y')) et vous devriez aller bien. Cela est dû au fait que la section SELECT de votre requête n'est pas exécutée tant que la section WHERE n'a pas terminé la correspondance des lignes à renvoyer.

+0

La partie concernant la section 'SELECT' est fausse. Je ne vais pas vous downvote, mais essayez d'exécuter la requête suivante: 'SET @r: = 1; SELECT @r: = id + 1 FROM mytable WHERE @r = id' sur n'importe quelle table avec des identifiants consécutifs commençant par '1'. – Quassnoi

0

La partie WHERE est exécutée avant l'alias dans la liste des champs. La meilleure chose est d'utiliser BETWEEN dans la clause WHERE afin qu'un index puisse être utilisé.

3
SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS `year` 
FROM table_name 
HAVING `year` = 2009 

Contrairement WHERE clause, HAVING clause peut référencer les SELECT alias clause.

Plus indice moyen efficace serait:

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

alors que ces deux requêtes fonctionnent, cette réponse ne décrit pas pourquoi les deux résolvent le problème de 'year' dans la clause where. (aussi les deux sont structurés d'une manière légèrement moins normale que l'appariement contre l'année dans la clause where) – Jehiah

3

Une autre alternative, la répétition d'éviter d'un appel de fonction biggish:

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

Vous pourriez encore avoir besoin d'utiliser apostrophes autour du mot « année » pour éviter les conflits avec l'année comme un mot-clé. L'optimiseur ne devrait pas avoir besoin de créer une table intermédiaire pour répondre à cette requête.