2009-11-10 15 views
15

que estoy usando esto:MySQL - seleccionar año a partir de una marca de tiempo Unix

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

pero me da un error:

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

Tanto "my_unix_timestamp_column" y "nombre_tabla" son correctas, no me ¡sé por qué me da esto!

estoy usando PHP 5.3.0

Respuesta

19

No estoy muy seguro de si esto se debe a YEAR ser una palabra reservada en MySQL o porque quiere que haga algo a lo largo de las líneas de:

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

no puede recordar si el último número sólo es relevante para GROUP Ings: S

0

No se puede utilizar una columna crea la sección SELECT en su cláusula WHERE

sustituir la variable year en su cláusula where con la función real de crear ese columna (también conocida como FROM_UNIXTIME(my_unix_timestamp_column, '%Y')) y deberías estar bien.

Esto se debe a que la sección SELECT de su consulta no se ejecuta hasta que la sección WHERE haya terminado de hacer coincidir filas para devolver.

+0

La parte sobre la sección 'SELECT' es simplemente incorrecta. No lo rechazaré, pero intente ejecutar la siguiente consulta: 'SET @r: = 1; SELECCIONE @r: = id + 1 FROM mytable WHERE @r = id' en cualquier tabla con ID consecutivos comenzando desde '1'. – Quassnoi

0

La parte WHERE se ejecuta antes del alias en la lista de campos. Lo mejor es usar BETWEEN en la cláusula WHERE para que se pueda usar un índice.

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

diferencia de WHERE cláusula, HAVING cláusula puede hacer referencia a los SELECT alias cláusula.

Más índice de manera eficiente sería:

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

mientras ambas consultas funcionan, esta respuesta no describe por qué ambas resuelven el problema de 'año' en la cláusula where. (también ambos están estructurados de una manera ligeramente menos normal que la comparación con el año en la cláusula where) – Jehiah

3

Otra alternativa, evitando la repetición de una función llamada biggish:

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

Es posible que todavía tienen que usar otra forma de comillas alrededor de la palabra 'año' para evitar conflictos con año, como una palabra clave. El optimizador no debería necesitar crear una tabla intermedia para responder esta consulta.

Cuestiones relacionadas