Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP] Data najbliższa obecnej
Forum PHP.pl > Forum > Przedszkole
nitroo
Witam. Chcę napisać skrypt pokazujący urodziny użytkowników, którzy znajdują się bazie.

Pole data_urodzenia w bazie jest typu DATE (czyli np. 2010-01-01).

Napisałem taki kod:

  1. $lacz = lacz_bd();
  2. $lacz->query("SET NAMES 'latin2'");
  3.  
  4. $wynik = $lacz->query("select imie_nazwisko, data_urodzenia from zawodnik_pl order by data_urodzenia desc");
  5. while ($pokaz = $wynik->fetch_assoc())
  6. {
  7. /* Wiek - lata*/
  8. $data_urodzenia = substr($pokaz['data_urodzenia'], 0, 4);
  9. $teraz = date("Y");
  10. $wiek = $teraz-$data_urodzenia;
  11.  
  12. /* Miesiac urodzenia */
  13. $miesiac_nazwa = array (01 => 'stycznia', 02 => 'lutego', 03 => 'marca', 04 => 'kwietnia', 05 => 'maja', 06 => 'czerwca', 07 => 'lipca', 08 => 'sierpnia', 09 => 'wrzeŚnia', 10 => 'paĽdziernika', 11 => 'listopada', 12 => 'grudnia');
  14. $miesiac = substr($pokaz['data_urodzenia'], 5, 2);
  15.  
  16. /* Wyswietlanie urodzin */
  17. print $pokaz['imie_nazwisko'].' - '.$wiek.' lat (miesiac: '.$miesiac_nazwa[$miesiac].')<br />';
  18. }


Problemem jest jeszcze to, iż nie do końca dobrze pokazuje mi nazwy miesięcy... Wyświetla mi tylko w przedostatnim, tj. 19-stym, rekordzie.

Proszę o pomoc smile.gif Nie wiem, jak się zabrać do wyświetlania urodzin użytkownika najbliższej dzisiejszej dacie. Patrzyłem na funkcje mktime, ale nie za dużo wywnioskowałem.
sadistic_son
zainteresuj się funkcją strtotime. Fantastycznie "obrabia" wszystkie stringi datowe.
nitroo
Cytat(sadistic_son @ 8.09.2010, 00:05:27 ) *
zainteresuj się funkcją strtotime. Fantastycznie "obrabia" wszystkie stringi datowe.

Ok, to jest do wyświetlenia daty, ale jak zabrać się za posortowanie użytkowników wg daty najbliższych urodzin?
Darti
pisane z palca ale ogólnie użyłbym datediff()
  1. SELECT DATEDIFF(DATE_FORMAT(CURDATE(),'%m-%d'),DATE_FORMAT('data_urodzenia','%m-%d')) AS roznica WHERE roznica > 0 ORDER BY roznica LIMIT 1
nitroo
Zrobiłem tak:
  1. SELECT id, imie_nazwisko, DATEDIFF(DATE_FORMAT(CURDATE(),'%m-%d'), DATE_FORMAT('data_urodzenia','%m-%d')) AS roznica FROM zawodnik_pl WHERE roznica > 0 ORDER BY roznica LIMIT 1

i jest Fatal error: Call to a member function fetch_assoc() on a non-object sad.gif
Darti
to jest błąd php a nie mysql ... jak już to mysql_fetch_assoc()
nitroo
Zauważyłem w SQL, iż nie wykonuje się DATE_FORMAT('data_urodzenia','%m-%d'), tzn. jest równy NULL, a roznica jest nieznaną klauzurą where.
Pilsener
1. Nazw pól w bazie nie dajemy w apostrofy
2. Funkcja datediff nie porówna dat w tym formacie
3. Where nie zadziała
nitroo
Cytat(Pilsener @ 8.09.2010, 11:34:06 ) *
1. Nazw pól w bazie nie dajemy w apostrofy
2. Funkcja datediff nie porówna dat w tym formacie
3. Where nie zadziała

To co mam zrobić?
Noidea
Konwertuj sobie daty do formatu MMDD. Takie "daty" możesz sobie odejmować, porównywać, sortować, itp.

  1. SELECT DATE_FORMAT( '1966-09-05', '%m%d' ) - DATE_FORMAT( CURDATE(), '%m%d' ) AS roznica;
  2. SELECT DATE_FORMAT( '1972-09-08', '%m%d' ) - DATE_FORMAT( CURDATE(), '%m%d' ) AS roznica;
  3. SELECT DATE_FORMAT( '1986-09-13', '%m%d' ) - DATE_FORMAT( CURDATE(), '%m%d' ) AS roznica;
Pilsener
Cytat(nitroo @ 8.09.2010, 10:16:15 ) *
To co mam zrobić?


Myśleć i korzystać z netu.

1. Podstawy składni SQL, nazwy pół dajemy albo bez niczego, typu select nazwa_pola albo w `` select `nazwa_pola` (taki piksel pod tyldą), jak dajesz funkdji date_format string typu 'blablabla' to chyba oczywiste, że nie zamieni tego na datę?
2. A jakiego formatu może oczekiwać datediff jak w bazie masz datę w formacie rrrr-mm-dd? Format mm-dd raczej nie zadziała i funkcja zwróci błąd lub wartość zero, musisz dodać rok.
http://dev.mysql.com/doc/refman/5.1/en/dat...nction_datediff
3. Zamiast where użyj having.
nitroo
A jak poradzić sobie w końcu z tymi nazwami miesiąca i dlaczego napisany przeze mnei sposób nie działa?

Jestem początkującym programistą i naprawdę nie mam zielonego pojęcia, jak poprawnie ma wyglądać to zapytanie SQL. Próbowałem różnymi metodami, ale przy DATEDIFF bierze mi pod uwagę rok, przez co źle oblicza mi osobę, która ma najbliższe urodziny. Może mi ktoś pomóc?
nitro11
Dużo ciekawych rzeczy:

  1. http://www.bigresource.com/PHP-Search-Members-By-Birthday-dRE0oo8w.html#related
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.