Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Datetime problem
Forum PHP.pl > Forum > Bazy danych > MySQL
michal_s
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.
wookieb
  1. twoja_kolumna_z_data > data_2_godziny_temu

dara_2_godziny_temu wygeneruj w php, nie w zapytaniu.
michal_s
Nie dałoby się tego zrobić w samym sql, countem zliczyć rekordy i wyrzucić samą liczbę?
wookieb
No to zrób counta. Ja podałem Ci tylko częśc zapytana WHERE
michal_s
Mam jeszcze pytanie. jak od tego
  1. date("Y-m-d H:i:s")
odjąć dwie godziny?
wookieb
strtotime
albo
mktime
michal_s
ok, wielkie dzięki. Działa.
pmir13
  1. SELECT * FROM wpisy WHERE datawpisu > now() - INTERVAL 2 HOUR
wookieb
Cytat(pmir13 @ 15.04.2011, 17:20:52 ) *
  1. SELECT * FROM wpisy WHERE datawpisu > now() - INTERVAL 2 HOUR

Tak się nie zadaje zapytań do baz danych.
michal_s
tzn ja zrobiłem z
  1. strtotime ("-2 hour")
ale może faktycznie to co pmir13 podał jest lepsze bo nie musze obliczać daty przez php a działa tak samo ...
wookieb
Ale nigdy nie skorzysta z indeksu tabeli nawet jeżeli istnieje + nie skorzysta z cache.
pmir13
Sugerując się nazwą działu forum chodziło o zapytanie SQL.
Oczywiście trafnie zgadłeś że autor używa php, ale wciąż było to zgadywanie.
Gdybyś miał dostęp tylko do klienta mysql jak byś to zrobił?
wookieb
Wpisałbym z palca.
pmir13
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.
wookieb
Cytat(pmir13 @ 15.04.2011, 19:18:26 ) *
jest zwykłym wprowadzaniem ludzi w błąd.

Tak zgodzę się, sprawdziłem. Wybaczcie, musiało mi się coś pomieszać.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.