bikebog
25.09.2008, 19:12:39
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
25.09.2008, 19:24:21
w bazie dać termin wyświetlanai od do i do warunku wrzucić
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
bikebog
25.09.2008, 19:34:32
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?
melkorm
25.09.2008, 20:16:24
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
25.09.2008, 20:23:04
A jak będzie od 13 stycznia do 20 czerwca? To jak zrobić?

hihihi
hateman
25.09.2008, 20:45:43
ja bym to zrobił w PHP i sprawdzał który to jest dzień roku

<?php
?>
bikebog
25.09.2008, 20:54:38
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
25.09.2008, 20:56:55
jak to nie?
zmieniasz tylko zakres
<?php
?>
melkorm
25.09.2008, 21:12:15
ja wyświetlisz dzień bez roku?
hateman
25.09.2008, 21:20:25
Cytat(melkorm @ 25.09.2008, 22:12:15 )

ja wyświetlisz dzień bez roku?


?
ale o co chodzi?

'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
25.09.2008, 21:27:10
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
bikebog
25.09.2008, 21:31:10
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
25.09.2008, 21:42:52
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
25.09.2008, 21:46:21
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
25.09.2008, 21:49:39
Tak, myslałem o tym

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
25.09.2008, 21:59:17
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ź:
<?php
$a = 130
$b = 100 lub 150
if( $a < $b) {}
else {}
?>
Jak wygląda Twoj skrypt?
hateman
25.09.2008, 22:34:58
przecież pisałem Ci całą funkcję:
<?php
if(13
> date('z') > 350){ rób coś
}
?>
To robi coś jeżeli dzisiaj jest dzień miedzy któryś grudnia, a 13 stycznia
aby sprawdzić czy dzisiaj mamy rok przestępny to
<?php
if(!($rok%4)){
dodaj 1 do dni po 28lutego
}
?>
bikebog
25.09.2008, 22:50:58
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?

Pozdrawiam
Mchl
25.09.2008, 23:03:04
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

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ę

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

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
25.09.2008, 23:19:04
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

a o to SQL :
SELECT * FROM test WHERE CASE WHEN dateStart > dateEnd THEN ((dateStart < DAYOFYEAR(NOW())) AND (DAYOFYEAR(NOW()) > dateEnd))
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

edit -> literówka
Mchl
25.09.2008, 23:21:03
A gdzie tak napisał?
melkorm
25.09.2008, 23:33:52
No wiesz gdyby miał pełne daty moje 1 zapytanie by działało

I chyba cały temat wisi jeszcze na tym że kolega nei chciał mieć roku w bazie by go nie aktualizować "over and over"
Mchl
25.09.2008, 23:43:33
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
25.09.2008, 23:50:45
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

Chodzi o to że nei ważne jaki rok będzie wiek czy cokolwiek wyświetlać będzie się jedno info
Mchl
26.09.2008, 07:23:23
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
26.09.2008, 08:26:48
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
26.09.2008, 08:38:00
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.