Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyszukiwanie najbliższej daty bez uwzględnienia roku
japolak
post
Post #1





Grupa: Zarejestrowani
Postów: 106
Pomógł: 0
Dołączył: 11.03.2007
Skąd: Łódzkie

Ostrzeżenie: (0%)
-----


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ć(IMG:style_emoticons/default/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.

Ten post edytował japolak 23.08.2012, 17:42:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
bpskiba
post
Post #3





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


albo inaczej..... (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
japolak
post
Post #4





Grupa: Zarejestrowani
Postów: 106
Pomógł: 0
Dołączył: 11.03.2007
Skąd: Łódzkie

Ostrzeżenie: (0%)
-----


Dzieki pmir13 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/questionmark.gif) ?

da rade jeszcze zrobić to w tym zapytaniu czy odpuścić sobie i zapytać przez php??

Ten post edytował japolak 23.08.2012, 21:38:00
Go to the top of the page
+Quote Post
pmir13
post
Post #5





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
japolak
post
Post #6





Grupa: Zarejestrowani
Postów: 106
Pomógł: 0
Dołączył: 11.03.2007
Skąd: Łódzkie

Ostrzeżenie: (0%)
-----


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..
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 04:18