2009-11-10 15 views
15

Używam tego:Mysql - Wybór roku z uniksowego znacznika czasu

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

ale daje mi błąd:

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

Zarówno "my_unix_timestamp_column" i "table_name" są poprawne, i nie wiem, dlaczego to daje mi to !!!

Używam PHP 5.3.0

Odpowiedz

19

Nie jestem pewien, czy to ze względu na YEAR jest słowo zarezerwowane w MySQL lub dlatego, że chce zrobić coś wzdłuż linii:

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

nie pamiętam czy ostatnia kwestia ma znaczenie tylko dla GROUP Ings: S

0

Nie można użyć kolumny stworzył sekcję SELECT w klauzuli WHERE

zastąpić zmienną year w klauzuli WHERE z rzeczywistą funkcją tworzenia że kolumna (aka FROM_UNIXTIME(my_unix_timestamp_column, '%Y')) i powinieneś być w porządku.

To dlatego, że sekcja zapytania SELECT nie jest wykonywana, dopóki sekcja WHERE nie zakończyła dopasowywania wierszy do powrotu.

+0

Część dotycząca sekcji "WYBIERZ" jest po prostu błędna. Nie odrzucę cię, ale spróbuj uruchomić następującą kwerendę: 'SET @r: = 1; SELECT @r: = id + 1 FROM mytable WHERE @r = id' na dowolnej tabeli z kolejnymi identyfikatorami zaczynając od '1'. – Quassnoi

0

Część WHERE jest wykonywana przed aliasingiem na liście pól. Najlepiej jest użyć BETWEEN w klauzuli WHERE, aby można było użyć indeksu.

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

przeciwieństwie WHERE klauzuli HAVING klauzula może odwoływać się SELECT klauzula aliasów.

Więcej indeks skutecznym sposobem byłoby:

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

podczas gdy oba te zapytania działają, ta odpowiedź nie opisuje, dlaczego oba rozwiązują problem "roku" w klauzuli where. (oba są zbudowane w nieco mniej normalny sposób niż dopasowanie do roku w klauzuli where) – Jehiah

3

Inną alternatywą, unikając powtarzania z biggish wywołania funkcji:

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

Możecie nadal trzeba używać back-cudzysłowie słowo „rok”, aby uniknąć konfliktów z roku jako jedno ze słów kluczowych. Optymalizator nie musi tworzyć tabeli pośredniej, aby odpowiedzieć na to zapytanie.

Powiązane problemy