![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 1 Dołączył: 22.01.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam taki problem:
Mam tabele w bazie danych zawierajaca kolumne typu datetime - co chcialbym z tym zrobic: Chcialbym uzyskac pierwszy rekord w tabeli, dla ktorego data jest wieksza od obecnej (mowiac prosciej, chcialbym pobrac rekord dotyczacy najblizszego wydarzenia, ktore bedzie mialo miejsce). Nie mam pojecia z jakiej funkcji uzyskac obecny czas by mozna bylo porownac te daty, na chwile obecna mam: date - kolumna typu datetime. Odziwo sprawdza sie to w przypadku gdy zmieniam znak nierownosci, natomiast nie dziala to w takim przypadku (czyli de facto nie dziala) Zastanawiam sie wiec w jaki sposob moge dokonac takiego porownania by osiagnac oczekiwany rezultat. Z góry dziekuje. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie wpadłeś na to by sprawdzić jakie funckje z rodziny "czasu i daty" oferuje MySQL? http://dev.mysql.com/doc/refman/5.5/en/dat...-functions.html
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 1 Dołączył: 22.01.2011 Ostrzeżenie: (0%) ![]() ![]() |
No właśnie nie wpadłem
![]() Na ta chwile cale zapytanie wyglada tak:
pole date zamienilem na pole typu timestamp (zreszta niewazne jakiego typu ustawie pole - wynik jest taki sam) i teraz bez wzgledu na to jaki ustawie znak nierownosci wynik wciaz nie ulega zmianie, wiec zakladam, ze moje zapytanie jest blednie skonstruowane - tutaj prosilbym o poprawienie. Dodam tez, ze poza CURRENT_TIMESTAMP wstawialem tam NOW() oraz kilka innych funkcji. Ten post edytował Zikerus 23.01.2011, 12:07:46 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ustaw pole na int i porównuj unix timestamp - najprostrza i najefektywniejsza metoda (bo porównujesz 2 inty).
To pytanie przewija się tu conajmniej co tydzień... -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
CURRENT_TIMESTAMP() i NOW() to to samo. Pokaż może kompletną strukturę bazy danych, trochę przykładowych danych i wynik jaki chciałbyś osiągnąć swoim zapytaniem.
Swoją drogą może problem jest z kolejnością wykonywania warunków? AND ma większą moc niż OR, więc na chwilę obecną Twoje zapytanie to: A zakładam, że chcesz uzyskać:
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 1 Dołączył: 22.01.2011 Ostrzeżenie: (0%) ![]() ![]() |
Hmm, no to faktycznie, nie miałem pojęcia, że AND ma pierwszenstwo przed OR, dodalem teraz nawias i wszystko dziala tak jak powinno, wielkie dzieki.
Moglbys moze jeszcze mi powiedziec jaka wartosc zwraca zapytanie "SELECT COUNT(*)..."? Chcialbym uzyskac ilosc rekordow spelniajacych dane warunki, zeby potem wyliczyc sobie offset - teraz chcialbym wyswietlic kilka poprzednich zdarzen, kolejne i pare nastepnych, co za tym idzie:
Chce zliczyc ilosc rekordow, ktore 'mialy' juz miejsce i wybrac z nich 3 ostatnie do syswietlenia (wedlug daty 3 ostatnie) Czyli majac 20.01.2011 19.01.2011 24.01.2011 18.01.2011 16.01.2011 21.01.2011 Musze wyswietlic nastepujace rekordy w odpowiedniej kolejnosci: 19.01.2011 20.01.2011 21.01.2011 Dlatego chce wyliczyc offset (ogolna ilosc rekordow spelniajacych warunek - 3) i wtedy wyciagnac z bazy te 3 rekordy ostatnie spelniajace warunek. Nie wiem czy dobrze mysle, moze da sie to zrobic w inny sposob? Problem polega na tym, ze nie wiem jak wydobyc liczbe rekordow z tego zapytania, odziwo nigdy z niego nie korzystalem i sprawia mi trudnosci, nigdzie nie moge znalezc odpowiedzi. BTW. ciezko bedzie podac strukture bazy, bo narazie to sa 2 id i data, danych tez za duzo do testowania nie mam, tylko kilka rekordow rozniacych sie od siebie data. @EDIT Wartosc SELECT COUNT(*) juz uzyskalem, moj blad. Zastanawiam sie jednak czy nie mozna tego zrobic w inny sposob (tego co opisalem) @EDIT2 Jeszcze jedno pytanko, odbiegajace juz troche od tematu - czy mozna w jednej bazie zastosowac oba typy tabel (MyISAM i InnoDB) ![]() Ten post edytował Zikerus 23.01.2011, 13:26:49 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Tak, możesz korzystać równocześnie z tabel typu InnoDB, MyISAM, MEMORY itd.
2. O ile dobrze zrozumiałem, to wszystko co musisz zrobić to:
PS. Fatalną praktyką jest nazywanie tabel/kolumn wyrazami zastrzeżonymi (takimi jak DATE, SELECT, FROM). Tą kolumnę "date" zamień na jakieś "created_at" czy "published_at". |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 1 Dołączył: 22.01.2011 Ostrzeżenie: (0%) ![]() ![]() |
Poki co jest to wersja robocza, wiec i tak i tak beda pozmieniane pozniej kolumny
![]() odnosnie tego zapytania: pokaze ono 3 pierwsze rekordy spelniajace warunek, ja natomiast potrzebuje 3 ostatnie, Wiec do Twojego zapytania powinien dojsc jeszcze OFFSET na podstawie mojego wczesniejszego zapytania - tak tez zrobilem, zastanawialem sie jedynie czy jest mozliwosc, by zapisac to w inny sposob. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 1 Dołączył: 22.01.2011 Ostrzeżenie: (0%) ![]() ![]() |
Tak, tylko w takim wypadku rekordy wyswietla sie w innej kolejnosci, nie mam racji? Jezeli bede mial powiedzmy rekordy z datami:
20.01.2011 19.01.2011 24.01.2011 18.01.2011 16.01.2011 21.01.2011 To wyswietlajac 3 wedlug Twojej metody wyswietli mi: 21.01.2011 20.01.2011 19.01.2011 Nie mam racji? Mi natomiast zalezy na zachowaniu ich kolejnosci ![]() |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Jestem pewien, że potrafisz zrobić pętlę, która wyświetla liczby od 0 do 100. A potrafisz zrobić pętlę, która wyświetla liczby od 100 do 0? Pewnie, też. W takim razie jest w stanie wyświetlić te wyniki w odwrotnej kolejności.
Jeżeli masz w miarę normalnie napisany kod (tj. pobranie i obróbka danych w jednym miejscu, wyświetlanie już przetworzonych danych w drugim) to sprawa jest wyjątkowo prosta:
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 17:49 |