Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Datetime problem
michal_s
post
Post #1





Grupa: Zarejestrowani
Postów: 148
Pomógł: 1
Dołączył: 11.12.2010

Ostrzeżenie: (0%)
-----


Witam, mam problem z zapytaniem.
W tabeli mam jedną kolumnę w formacie datetime. I chciałbym zliczyć wszystkie wpisy z powiedzmy dwóch ostatnich godzin. Nie mam pojęcia jak się za to zabrać. Może jakoś odjąć je.. ale to też mi nie działa. Prosiłbym o jakieś wskazówki albo przykładowy kod który bym sobie dostosował. Z góry dzięki za odp i pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


Zapewne obliczając datę ręcznie by "skorzystał z indeksu"?
Tylko że klauzule WHERE są parsowane przed jakąkolwiek optymalizacją, a wyrażenie
  1. now() - INTERVAL 2 HOUR

ma ściśle określoną wartość zanim dojdzie do próby wyboru indeksu.
Prawie nie różni się więc od gotowej daty dostarczonej przez php.
Tzn różni się tylko tym, że wymagany jest dodatkowy język programowania.

Przykładowa testowa baza danych:
  1. CREATE TABLE IF NOT EXISTS `test`.`daty` (
  2. `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `kiedy` DATETIME NOT NULL
  4. ) ENGINE = MYISAM ;
  5.  
  6. ALTER TABLE `daty` ADD INDEX ( `kiedy` ) ;
  7.  
  8. INSERT INTO `test`.`daty` ( `kiedy` ) VALUES ( NOW( ) - INTERVAL 3 HOUR );
  9. INSERT INTO `test`.`daty` ( `kiedy` ) VALUES ( NOW( ) );


Zobaczmy więc co nam powie explain:
  1. EXPLAIN SELECT * FROM `daty` WHERE `kiedy` > NOW( ) - INTERVAL 2 HOUR


Possible keys: kiedy
Key: kiedy

Zatem
Cytat(wookieb @ 15.04.2011, 17:31:10 ) *
Ale nigdy nie skorzysta z indeksu tabeli nawet jeżeli istnieje + nie skorzysta z cache.

jest zwykłym wprowadzaniem ludzi w błąd.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 16:23