Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] wyświetlanie w czasie od .. do ..
Forum PHP.pl > Forum > Przedszkole
bikebog
Witam.

Chciałbym cyklicznie (co roku) wyświetlać z bazy danych "jakiś tekst" w określonym terminie, np.:
- od 01 września do 01 listopada;
- od 10 grudnia do 30 stycznia.

Proszę o przykład skryptu, który by to wykonał.

Pozdrawiam.
melkorm
w bazie dać termin wyświetlanai od do i do warunku wrzucić

  1. WHERE dateStart < NOW() AND dateEnd > NOW() LIMIT 1


limit w razie nakładających się textów ;p

sądze że pomogłem i że to wystarczy smile.gif
bikebog
Super! myślałem o czymś w tym stylu, ale w tym przypadku musiałbym co roku aktualizować ROK w dacie, a zależy mi by tego nie robić:(

Czy jest jakieś rozwiązanie?smile.gif
melkorm
  1. WHERE MONTH(dateStart) < MONTH(NOW()) AND month(dateEnd) > month(NOW()) LIMIT 1


i leci po miesiacach ;]

chociaż... to wszystko zalezy jakie wpisy będziesz tam dawać bo styczeń to wkońcu jedynka a grudzień to 12 więc jakbyś mógł bardziej zdefiniować przykład w sensiej co dokładnie chcesz uzyskać bo tak ogólnego zapytania chyban ie ma ;]
bikebog
A jak będzie od 13 stycznia do 20 czerwca? To jak zrobić?smile.gif hihihi
hateman
ja bym to zrobił w PHP i sprawdzał który to jest dzień roku smile.gif

  1. <?php
  2. if(13 < date('z') <120)
  3. ?>
bikebog
Wszystko było by dobrze, gdyby wyświetlanie dotyczyło tego samego roku, a jak mamy wyświetlić np.:

- od 15 grydnia do 10 stycznia

to taki skrypt niezadziała prawidłowo dlatego chodzi mi o coś co będzie wyświetlało dany rekord w przedziale czasowym na podstawie dnia i miesiąca. Chyba trochę zakręciłem, ale mam nadzieje, że mnie rozumiecie:)
hateman
jak to nie?
zmieniasz tylko zakres

  1. <?php
  2. if(13 > date('z') > 320
  3. ?>
melkorm
ja wyświetlisz dzień bez roku? snitch.gif
hateman
Cytat(melkorm @ 25.09.2008, 22:12:15 ) *
ja wyświetlisz dzień bez roku? snitch.gif


questionmark.gif?

ale o co chodzi? tongue.gif

'z' wyświetla który dzisiaj mamy dzień roku
jak chcemy żeby coś się działo w styczniu to 'z' musi być mniejsze od 31
Czego nie rozumiecie?
nie ma znaczenia jaki rok.

Ma tylko w latach przestępnych trzeba dodać sobie 1 dzień w lutym :]
Można npisać na to prostą funkcje sprawdzającą rok
melkorm
ta, ale wtedy w bazie musisz trzymać dni od którego do którego coś ma się dziać, a jeżeli coś ma się dziać od grudnai do lutego ?

czyli w stylu 345 - 22 ? (dni) => w phpiem ozan dać warunek i będzie smigać ale wtedy w tablcy muszą być wrzucone dni ... a ja mam już prawie zapytanie biggrin.gif
bikebog
W tym samym roku Twoja funkcja będzie dobra i wszystko będzie super działać, lecz jeżeli zakres dotyczy dni znajdujących się w RRRR oraz RRRR+1 to zadziała?

Rok ma powiedzmy 365 dni. jeżeli chcemy wyświetlić coś między 360 dniem 2008 roku i 31 dniem 2009 roku, to jak to zrobić? tak by trzymało się kupy i by przestrzegać tego o czym pisałem wyżej (nie brać pod uwagę aktualizacji w bazie roku danego rekordu).

Wszystko było by okej gdyb nie to, że zakres dotyczyć będzie także miesięcy i dni z różnych RRRR.


Macie pomysł na zapytanie do bazy lub skrypt?
hateman
To ja już nie rozumiem..
Masz konkretne lata?
Jeżeli rok nie ma znaczenia to dzień w roku jest najlepszym rozwiązaniem
chyba że masz od 1.12.2004 do 2.11.2008 to już nie będzie dobrze
Pilsener
Mamy - nie używać formatu daty typu DD MM RRRR tylko przestawić się na unixowy znacznik czasu, czyli to, co zwraca w php funkcja time() - w bazie robisz pole integer i śmiga jak burza, a wyszukiwanie pomiędzy dwiema datami jest banalne. Doceniłem to, kiedy robiłem terminarz i trzeba było duplikować czy przesuwać zadania - zadanie od 10.30 do 12.45 nie mogło kolidować z żadnym innym w tym terminie - dochodzą święta ruchome i nieruchome - pełna tragedia. A dodanie np. do daty miesiąca i dwóch tygodni? Strtotime - i jest. Nie wyobrażam sobie powrotu do daty typu DATETIME.
melkorm
Tak, myslałem o tym tongue.gif I masz pełną racje i to jest najlepsze rozwiązanie. Gdyby nie to że użtkownik jak cholera niechce mieć tam lat a do tego by uzyskać unixowy znacznik czasu potrzbeujesz roku :/
bikebog
Wyświetlanie będzie cykliczne co roku. Poniżej podaję przykłady:

od 1 stycznia do 31 stycznia;
od 10 lutego do 15 czerwca;
od 15 lutego do 11 maja;
od 10 grudnia do 15 stycznia;

Zgodnie z tym co mówisz chcesz abym w bazie zapisywał dwie zmienne (numery dni danych dni miesiąca). Problem może pojawićsię w roku przestępnym:(

Mówisz, że masz gotową funkcję na tą sytuację:) Jeśli można to poproszę. Dla upewnienie podaję przykład jak zinterpretowałem Twoją odpowiedź:

  1. <?php
  2. $a = 130
  3. $b = 100 lub 150
  4.  
  5. if( $a < $b) {}
  6. else {}
  7. ?>


Jak wygląda Twoj skrypt?
hateman
przecież pisałem Ci całą funkcję:

  1. <?php
  2. if(13 > date('z') > 350){
  3. rób co&#347;
  4. }
  5. ?>


To robi coś jeżeli dzisiaj jest dzień miedzy któryś grudnia, a 13 stycznia

aby sprawdzić czy dzisiaj mamy rok przestępny to
  1. <?php
  2. $rok=date('Y');
  3. if(!($rok%4)){
  4. dodaj 1 do dni po 28lutego
  5. }
  6. ?>
bikebog
Rozumiem, że przy pobieraniu rekordów z bazy i puszczaniu tej funkcji w pętli skrypt będzie wydajny?;-)

OK, No to wariant w PHP już mamy, czy można to teraz przenieść na SQL?smile.gif

Pozdrawiam
Mchl
A ja próbowałbym tak:
W bazie danych zapisane startDate, endDate. Właściwie dowolnie jak, byle by się dało wyciągnąć miesiąc i dzień. Ja bym zapisał jako timestamp z rokiem 1970 winksmiley.jpg

I teraz
Kod
SELECT * FROM table
WHERE
(DATEDIFF(endDate,startDate) > 0 AND MONTH(startDate) >= MONTH(NOW()) AND DAY(startDate) >= DAY(NOW()) AND MONTH(endDate) <= MONTH(NOW()) AND DAY(andDate) <= DAY(NOW()))
OR
(DATEDIFF(endDate,startDate) < 0 AND MONTH(startDate) <= MONTH(NOW()) AND DAY(startDate) <= DAY(NOW()) AND MONTH(endDate) >= MONTH(NOW()) AND DAY(andDate) >= DAY(NOW()))


Tak na pałę trochę tongue.gif

[edit] Już widzę, że jest źle biggrin.gif

Kod
SELECT * FROM table
WHERE
(DATEDIFF(endDate,startDate) > 0 AND MONTH(startDate) >= MONTH(NOW()) AND DAY(startDate) >= DAY(NOW()) AND MONTH(endDate) <= MONTH(NOW()) AND DAY(andDate) <= DAY(NOW()))
OR
(DATEDIFF(endDate,startDate) < 0 AND (MONTH(startDate) >= MONTH(NOW()) AND DAY(startDate) >= DAY(NOW())) OR (MONTH(endDate) <= MONTH(NOW()) AND DAY(andDate) <= DAY(NOW())))


Tak chyba lepiej... gdzieś na pewno nawiasy pogubiłem
melkorm
Kod
DATEDIFF() returns expr1 – expr2 expressed as a value in days from one date to the other. expr1 and expr2 are date or date-and-time expressions.


kolega niechce mieć dat w bazie, tzn. lat (roku) :]

Więc datediff nei zadziała winksmiley.jpg

a o to SQL :

  1. SELECT * FROM test WHERE CASE WHEN dateStart > dateEnd THEN ((dateStart < DAYOFYEAR(NOW())) AND (DAYOFYEAR(NOW()) > dateEnd))
  2. ELSE ((dateStart < DAYOFYEAR(NOW())) AND (DAYOFYEAR(NOW()) < dateEnd)) END;


Z założeniem że dni nie nachodzą na siebie i są podane dni a nie daty smile.gif

edit -> literówka
Mchl
A gdzie tak napisał? tongue.gif
melkorm
No wiesz gdyby miał pełne daty moje 1 zapytanie by działało biggrin.gif I chyba cały temat wisi jeszcze na tym że kolega nei chciał mieć roku w bazie by go nie aktualizować "over and over" winksmiley.jpg
Mchl
Ale przy moim zapytaniu nie musi tego robić. Wykorzystywane są tylko dni i miesiące obu dat, oraz spraawdzane jest, czy data końcowa jest przed, czy po początkowej. Ważne, żeby miały ten sam rok.
melkorm
Kod
Ważne, żeby miały ten sam rok.


Kod
Wyświetlanie będzie cykliczne co roku. Poniżej podaję przykłady:

od 1 stycznia do 31 stycznia;
od 10 lutego do 15 czerwca;
od 15 lutego do 11 maja;
od 10 grudnia do 15 stycznia;


Z tego chyba wynika że nie będą te same lata smile.gif Chodzi o to że nei ważne jaki rok będzie wiek czy cokolwiek wyświetlać będzie się jedno info winksmiley.jpg
Mchl
Nie rozumiesz.
Chodzi o to, żeby daty początku i końca, były zapisane np jako rok 1970
Jeśli data początku jest wcześniejsza od końca, to znaczy że przedział czasu jest "wewnątrz" roku
startDate<przedzial<endDate

Jeśli zaś data końca jest wcześniejsza niż data początku, to znaczy, że przedział czasu jest "na przełomie" roku
początek roku<przedział<endDate || startDate<przedzial<koniec roku
f1xer
hmm nie wiem czy wy macie sztuczny problem czy ja źle myślę ale wystarczy w bazie zapisać datę dd.mm.start dd.mm.stop i stan wybierać rekordy które mają dzień i miesiąc startu mniejszy lub równy dzisiaj i to wszystko problem z koncem roku wystepuje tylko w przypadku gdy start i stop sa o 12 lub wiecej miesiecy oddalone jezeli start jest w grudniu a koniec w styczniu to wystarczy zalozyc ze gdy start zostanie spelniony to ustawia sie stan na aktywny i czeka do momentu osiagniecia stop wtedy zmienia sie stan na nie aktywny nie wiem czy ktos to rozumie ale tak chyba jest najprościej
bikebog
Dziękuję Wam:)

Każdy z Was dał (chodzi o efekt końcowy) dobry przykłd. Dziękuję za pomoc:)

Pozdrawiam.
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.