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 (1 - 14)
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. twoja_kolumna_z_data > data_2_godziny_temu

dara_2_godziny_temu wygeneruj w php, nie w zapytaniu.
Go to the top of the page
+Quote Post
michal_s
post
Post #3





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

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


Nie dałoby się tego zrobić w samym sql, countem zliczyć rekordy i wyrzucić samą liczbę?
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No to zrób counta. Ja podałem Ci tylko częśc zapytana WHERE
Go to the top of the page
+Quote Post
michal_s
post
Post #5





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

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


Mam jeszcze pytanie. jak od tego
  1. date("Y-m-d H:i:s")
odjąć dwie godziny?
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




strtotime
albo
mktime
Go to the top of the page
+Quote Post
michal_s
post
Post #7





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

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


ok, wielkie dzięki. Działa.
Go to the top of the page
+Quote Post
pmir13
post
Post #8





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

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


  1. SELECT * FROM wpisy WHERE datawpisu > now() - INTERVAL 2 HOUR
Go to the top of the page
+Quote Post
wookieb
post
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
michal_s
post
Post #10





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

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


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 ...

Ten post edytował michal_s 15.04.2011, 16:29:20
Go to the top of the page
+Quote Post
wookieb
post
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ale nigdy nie skorzysta z indeksu tabeli nawet jeżeli istnieje + nie skorzysta z cache.
Go to the top of the page
+Quote Post
pmir13
post
Post #12





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

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


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ł?
Go to the top of the page
+Quote Post
wookieb
post
Post #13





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wpisałbym z palca.
Go to the top of the page
+Quote Post
pmir13
post
Post #14





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
wookieb
post
Post #15





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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ć.
Go to the top of the page
+Quote Post

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: 24.12.2025 - 20:26