Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyszukiwanie najbliższej daty bez uwzględnienia roku
Forum PHP.pl > Forum > Bazy danych > MySQL
japolak
Witam

Mam taki problem
powiedzmy, że jest tabela

Tabela : i posiada kolumny : data | zdarzenie

przykładowe dane w tabeli:

2012-06-10 | ogien palił sie gdzies
2000-02-20 | był dzis potop
1993-09-28 | trzesienie ziemi
2003-12-03 | kometa przeleciała obok
1942-08-25 | mis polski wygrala

i tak dziś powiedzmy mamy date 2012 - 08 - 23

a ja chciałbym, aby moje pytanie wybrało najbliższą przyszłą możliwą date bez uwzględnienia roku czyli w tym przypadku chciałbym aby mi wybrało date 1942 - 08 - 25 ( mis polski wgrała)

a jak będzie dzień 2012 - 12 - 20 to żeby wybrało mi date 2000- 02 - 20 (był dziś potop)

jak to zrobićquestionmark.gif

program ma służyć do wybierania najbliższej rocznicy jakiś zdarzeń które są w bazie.

---------------------
Mi narazie udało sie dojść do takiej wersji:

najpierw sprawdzam czy w bazie znajduje wyższy numer dnia od dzisiejszego.
Kod
SELECT *
FROM EVENTS WHERE TYPE =  '0'
AND DAYOFYEAR( DATE ) > DAYOFYEAR( NOW( ) )
ORDER BY DATE DESC
LIMIT 1


a jesli nie ma wyniku to ustawiam date na 1 stycznia jakiegoś tam roku i sprawdzam drugi raz...
no ale chodzi mi oto zeby załatwić w 1 pytaniu

więc proszę o pomoc.
pmir13
Samo DAYOFYEAR(data) będzie powodować problemy w latach przestępnych.
Należałoby zamiast tego obliczać numer dnia rocznicy w bieżącym roku, skoro porównujemy to do aktualnej daty, czyli
  1. DAYOFYEAR(DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA)) YEAR))

Natomiast do ORDER BY można wrzucić CASE, jeśli dana rocznica w tym roku już minęła dodajemy do niej liczbę dni w bieżącym roku.
Ostatecznie mogłoby wyglądać to tak:
  1. SELECT zdarzenie,
  2. DAYOFYEAR(NOW())
  3. AS curdaynum,
  4. DAYOFYEAR(DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA)) YEAR))
  5. AS daynum
  6. FROM events
  7. ORDER BY
  8. CASE WHEN curdaynum<=daynum THEN daynum-curdaynum
  9. ELSE daynum-curdaynum+DATEDIFF(NOW(),NOW()-INTERVAL 1 YEAR) END
  10. LIMIT 1
bpskiba
albo inaczej..... arrowheadsmiley.png

  1. SELECT MONTH(e.DATA),DAY(e.DATA)
  2. FROM `events` e
  3. WHERE
  4. MONTH(e.DATA)>MONTH(NOW()) OR (MONTH(e.DATA)=MONTH(NOW()) AND DAY(e.DATA)>DAY(NOW()))
  5. ORDER BY 1,2
  6. LIMIT 1


pisane z palca
japolak
Dzieki pmir13 exclamation.gif twój sposób działa idelanie.

bpskiba - A tu coś nie do końca wychodzi.






----------------------

po przemyśleniu tego tematu doszedłem do wniosku, że jeszcze czegoś mi brakuje..

a mianiowicie. w bazie danych mam zapisywany dokładny czas - czyli jeszcze godzina minuta sekunda

wiec teraz mam dylemat co jeśli w danym dniu bede miał 2 zdarzenia..

aby wybrał najpierw ten z godziny 10 rano .. a po tej godzinie wybierał następny z godziny 15 questionmark.gif?

da rade jeszcze zrobić to w tym zapytaniu czy odpuścić sobie i zapytać przez php??
pmir13
Przy dokładniejszej dacie rezygnujemy całkowicie z dayofyear() i po prostu obliczamy datę najbliższej rocznicy, jeśli wyjdzie nam, że w tym roku już była, to dokładamy 1 rok:

  1. SELECT zdarzenie,
  2. CASE WHEN NOW()<
  3. DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA)) YEAR)
  4. THEN
  5. DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA)) YEAR)
  6. ELSE
  7. DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA) +1 ) YEAR)
  8. END
  9. AS rocznica
  10. FROM events
  11. ORDER BY rocznica
  12. LIMIT 1
japolak
Cytat(pmir13 @ 24.08.2012, 00:34:16 ) *
Przy dokładniejszej dacie rezygnujemy całkowicie z dayofyear() i po prostu obliczamy datę najbliższej rocznicy, jeśli wyjdzie nam, że w tym roku już była, to dokładamy 1 rok:

  1. SELECT zdarzenie,
  2. CASE WHEN NOW()<
  3. DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA)) YEAR)
  4. THEN
  5. DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA)) YEAR)
  6. ELSE
  7. DATE_ADD(DATA, INTERVAL (YEAR(NOW()) - YEAR(DATA) +1 ) YEAR)
  8. END
  9. AS rocznica
  10. FROM events
  11. ORDER BY rocznica
  12. LIMIT 1



działa - dzięki..
musze kiedyś sam poczytać jak działać z tymi instrukcjami warunkowymi z mysql .. bo widać znacznie można ułatwic sobie życie..

Dzieki jeszcze raz..
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.