Skocz do zawartości

[MYSQL] Dzisiejsze rekordy


Mar

Rekomendowane odpowiedzi

Nigdzie nie mogę znaleźć, jak skonwertować datę podczas zapytania sql, by zwrócić tylko rekordy dodane dziś.

Da się to jakoś od razu zliczyć, czy trzeba używać do tego kodu html?

Format daty w bazie mam uniksowy.

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, funkcja CURDATE(), o nią chodziło.

Czyli ostatecznie:

 SELECT * FROM_UNIXTIME(data) FROM `gdzies`WHERE DATE( FROM_UNIXTIME(DATA)) = CURDATE()

Dzięki za pomoc.

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Raczej powinieneś obliczyć czas przy użyciu dodatkowego zapytania lub kodu PHP a w where użyć warunku:

WHERE czas > XXXXXXXXXX

To jest optymalne.

Tak jak robisz to teraz to nie dość, że masz full table scan (nie możesz użyć żadnych indeksów) to jeszcze przy każdym porównaniu masz robioną konwersję. Koszmarnie wolne.

Tutaj jest też problem z tym, że szukanie w przedziale to zapytanie otwarte, więc np. WHERE czas in (XXXXXXXXXX, XXXXXXXXXX) będzie miało tak samo kiepską wydajnośc (chociaż już bez konwersji).

Najlepiej dodać do bazy dodatkowe pole numer dnia, czyli unixtime / (24*60*60) bo jeśli będziesz często sprawdzał w dużej bazie to serwer takim zapytaniem zajedziesz.

Odnośnik do komentarza
Udostępnij na innych stronach

Wykorzystuję to tylko do zliczania rekordów, czyli:

list($ile)=mysql_fetch_row(mysql_query("SELECT count(id) FROM gdzies WHERE DATE(FROM_UNIXTIME(DATA)) = CURDATE();"));

...czyli proponujesz takie rozwiązanie:

$dzis = date('Y-m-d');
list($ile)=mysql_fetch_row(mysql_query("SELECT count(id) FROM gdzies WHERE DATE(FROM_UNIXTIME(DATA)) = '$dzis';"));

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Raczej mam na myśli coś w stylu

$znacznik = mktime(0,0,0); // to pobiera dokładny znacznik czasowy początku dnia

list($ile)=mysql_fetch_row(mysql_query("SELECT count(id) FROM gdzies WHERE DATA>$znacznik"))

mysql i php muszą być ustawione na tą samą strefę czasową. Masz proste porównanie które może używać indeksów, a jeśli nawet indeksów nie ma to i tak powinno być dużo szybsze.

Można to też zrobić w czystym SQL-u, idea taka sama. Będą 2 zapytania, jedno SET @znacznik:= ... a potem porównasz WHERE DATA > @znacznik

Odnośnik do komentarza
Udostępnij na innych stronach

@slawek22 - nie widziałem planu zapytania w mysql wiec trudno mi powiedzieć czy bedzie użyty indeks czy nie, bazy mając oraz mądrzejsze optymalizatory i może się domyślą że zamiast

SELECT COŚ FROM GDZIEŚ WHERE date(JAKAS_KOLUMNA_Z_DATA) = CURDATE();

powinno być

SELECT COŚ FROM GDZIEŚ WHERE JAKAS_KOLUMNA_Z_DATA >  '2008-09-20' AND JAKAS_KOLUMNA_Z_DATA <  '2008-09-21';

Ale nie tego dotyczył watek :D

Odnośnik do komentarza
Udostępnij na innych stronach

Z tym optymalizatorem to różnie bywa. Raz kwerenda która miała w teorii działać szybko nie używała indeksu bo w warunku zamiast nazwy pola był alias. Cache rozróżnia wielkość liter (jak 2 razy wykonasz tą samą kwerendę to ci jej nie skeszuje jeśli w jednej masz where z dużej a w drugiej z małej:) )

Poza tym

WHERE JAKAS_KOLUMNA_Z_DATA > '2008-09-20' AND JAKAS_KOLUMNA_Z_DATA < '2008-09-21';

Tutaj mysql nie potrafi używać indeksów (można to obejść stosując bodajże polygony).

Zapytanie powinno być jednostronnie ograniczone, optymalizator nie ma informacji o tym, że lewą stronę można pominąć

Odnośnik do komentarza
Udostępnij na innych stronach

Format daty w bazie mam uniksowy.
Czy to znaczy że data jest zapisana jako liczba sekund ? Jeżeli tak to nie rozumiem dlaczego tak kombinujecie?

Można sprawdzić ile sekund było gdy zaczynał sie dzisiejszy dzień, a potem zwrocić z bazy rekordy ktore mają większą wartość.

Chyba że czegoś nie rozumiem? Mar pokaż jaką wartość ma przykładowa data zapisana w bazie?

.

Odnośnik do komentarza
Udostępnij na innych stronach

Chyba że czegoś nie rozumiem? Mar pokaż jaką wartość ma przykładowa data zapisana w bazie?
1222086831 -> 22-09-2008 14:33:51
Dokładnie, już 4 posty temu to napisałem wink.gif
Ja na samym początku podałem w jakim formacie jest czas :)

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności