Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [UnixTime] Zbliżające się urodziny
Forum PHP.pl > Forum > Bazy danych > MySQL
matrik
Witam
Jak mogę sprawdzić w bazie, kto ma za jakiś czas urodziny?
Mając pole urodzenie='1234567372'
Próbowałem używać funkcji FROM_UNIXTIME(urodzenie, '%Y %m %d') ale nie działa, nie wiem do końca dlaczego. Bo praktycznie chyba nie działa ta funkcja gdy szuka wyników.
Jedynie gdy już wyszuka, może wtedy zamienić wartość.

Chcę uniknąć wykorzystania formatu daty DATE
sebekzosw
powinieneś porównywać dni miesiąca i miesiące ze sobą a nie rok
Pilsener
Cytat
Jak mogę sprawdzić w bazie, kto ma za jakiś czas urodziny?
- czyli? Chcesz znaleźć czy ktoś ma urodziny np. 12 stycznia? Czy za 2 miesiące? 2 dni? Czy ileś tam sekund? Wyciągnij z 123... format MM-DD i porównaj z 123... + jakiś tam czas.
matrik
Wykombinowałem coś takiego:
  1. SELECT * FROM tabela WHERE (FROM_UNIXTIME(urodzenie,'%m') = 09 OR FROM_UNIXTIME(urodzenie,'%m') = 10)
  2. AND
  3. FROM_UNIXTIME(urodzenie,'%d') <= DAYOFMONTH(ADDDATE(CURDATE(), INTERVAL 15 DAY))


Ale jest taki błąd, że jeśli user ma urodziny 15 września a dzisiaj jest 30 wrzesień, to nie powinno wyświetlać go.
Wiem, że to jest wina ustawienia (FROM_UNIXTIME(urodzenie,'%m') = 09 OR FROM_UNIXTIME(urodzenie,'%m') = 10), ale musi tak być bo musi sprawdzać jeszcze kolejny miesiąc.

Jak rozwiązać ten problem?
nospor
http://dev.mysql.com/doc/refman/5.5/en/dat...-functions.html
PIerwszy przykład z brzegu
Cytat
Here is an example that uses date functions. The following query selects all rows with a date_col value from within the last 30 days:
mysql> SELECT something FROM tbl_name
-> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
z odpowiednią modyfikacją w drugą stronę rozwiązuje Twój problem. Bez żadnego rozbijania na miesiące. Skoro chcesz mieć za 15 dni to po grzyba robijać coś na miesiące? Od tego mysql ma funkcje operujące na datach niezależnie od lat czy miesiecy by z tego korzystac
matrik
Tak już robiłem ale nie jak ty napisałeś, samo wykorzystanie funkcji SUBDATE/DATE_SUB nic nie da
A co do tego, że nie trzeba wracać do miesięcy to jesteś w błędzie. A dlaczego?
Bo masz koniec miesiąca i ci nie pokazuje bo zapytanie patrzy tylko na dni.
A jeszcze musze korzystac z FROM_UNIXTIME.
Problem już mam rozwiązany, a kod nie wiem czy jest optymalny haha.gif ale działający.
nospor
Cytat
A co do tego, że nie trzeba wracać do miesięcy to jesteś w błędzie. A dlaczego?
Nie, to ty jesteś w błędzie. A dlaczego?
Bo
FROM_UNIXTIME(urodzenie,'%d') <= DAYOFMONTH(ADDDATE(CURDATE(), INTERVAL 15 DAY))
operujesz na dniach. (FROM_UNIXTIME(urodzenie,'%d'))

Spójrz na zapytanie, które ci podałem w manualu. Tam nikt nie operuje na kolumnie jako na dniach. Tam tylko dni biorą do ustalenia zakresu daty. To jest różnica i to jest kluczem do zagadki.
5k7
Nie wiem czemu się uparłeś żeby nie robić tego za pomocą daty. Rzecz jest bardzo banalna i łatwa w PHP np.

$czas = strtotime("+1 day");
$urodziny = date("Y-m-d", $czas);

Odpowiednio operujesz sobie ile dni chcesz lub tygodni czy miesięcy. W zmiennej urodziny masz gotowa date i potrzebujesz prostego selecta wink.gif


nospor
@5k7 równie banalnie proste jest do zrobienia w mysql, tak jak pokazałem. zapytanie będzie to samo co ty proponujesz, z tym że data docelowa będzie wyliczona bezpośrednio w mysql. php tu nie jest do niczego potrzebne, bo nic nowego ani lepszego nie wnosi
5k7
@nospor oczywiście że masz racje - to samo można zrobić w sql, natomiast wydaje mi się, że struktura jest dużo czytelniejsza i łatwiejsza do złapania dla początkującego. W ten sposób może w bardzo łatwy sposób manipulować datą w każdą stronę i z każdej daty. Pozatym wydaje mi się że dobrze jest jak najmniej obciązać sql'a bo to on jest przeważnie wąskim gardłem dla apliakcji, a serwer poradzi sobie z tym na strzał bez względu na obciążenie serwera sql.
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.