Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Obliczanie ilości dni
Kamilo
post
Post #1





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 4.12.2006
Skąd: Bydgoszcz

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


Witam

Są jakieś gotowe funkcje za pomocą których mogłabym obliczyć ilość dni pomiędzy dwoma datami ?
np. "2006-01-06" i "2006-12-15" interesuje mnie ilość dni pomiędzy tymi dwoma datami.

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No ale czy tak ciezko zajrzec do manuala?
http://dev.mysql.com/doc/refman/5.0/en/dat...-functions.html
Do wyboru do koloru


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kamilo
post
Post #3





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 4.12.2006
Skąd: Bydgoszcz

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


Dzieki za pomoc.
Polecenie którego szukałem to:
  1. mysql> SELECT DATEDIFF( 'data1' , 'data2' );
Go to the top of the page
+Quote Post
cytrysek
post
Post #4





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 4.01.2008

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


Witam,
a w jaki sposób obliczyć liczbę dni bez sobót i niedziel questionmark.gif

pzdr.
PW
Go to the top of the page
+Quote Post
dymsza
post
Post #5





Grupa: Zarejestrowani
Postów: 62
Pomógł: 4
Dołączył: 24.08.2006

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


są 2 wyjścia jedno łatwe i brzydkie 2 trudniejsze dla początkujących i możesz nie podołać.

opcja łatwa dla noobów : jeśli znasz przedział czasowy w jakim będzie działać aplikacja możesz utworzyć table z datami o strukturze id|data|numer_dnia
wypełniasz tą table wstępnie na pare lat rok ma 365dni wiec jak zrobisz nawet na 10 lat to będzie działało ok.

i tera piszesz tak.

  1. SELECT count(*) FROM tabela_z_datami WHERE numer_dnia NOT IN(6,7) AND DATA >= 'data1' AND DATA <= 'data2'


a druga metoda to funkcja wbudowana którą obliczasz to w pętli nie pisze przykładu bo sma bym musiał nad tym trochę po mędrkować .

jeśli jest inna opcja proszę o nie miłosierne skarcenia exclamation.gif!
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




jesli nie koniecznie musi to byc na mysql to:
http://nospor.pl/liczba-dni-roboczych-n23.html


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
fernet
post
Post #7





Grupa: Zarejestrowani
Postów: 91
Pomógł: 1
Dołączył: 22.03.2007

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


A czy nie bylo by lepiej pracowac na znaczkach czasu i przechowywac w bazie znaczki czasu. Wydaje mi sie ze to troche wydajniejsze niz pokretne zapytanie mysql


--------------------
Czy sprzedal sie juz czy dopiero ma? Oto pytanie, ktore stawiam wam. A czemu gdy byl, to nic tylko spal? Ze mna co lubie go gadac nic nie chcial. A czemu to gra, a tamtego nie. Chyba nas wszystkich nic nie szanuje. Jaki byl kiedy pil? Jaki byl kiedy gral? Czy to ten czlowiek sam czy moze rozni dwaj?
Go to the top of the page
+Quote Post
cytrysek
post
Post #8





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 4.01.2008

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


Wolałbym jednak zapytanie mysql.

http://nospor.pl/liczba-dni-roboczych-n23.html
tak widziałem, ale zapytanie mysql w moim przypadku byłoby wygodniejsze.

Ja to widze tak (czysta teoria):

mam 2 daty data_start i data_end
1. obliczam liczbe dni z tego przedzialu (np za pomocą DATEDIFF)

2. a od wyniku odejmuję liczbę dni, które w tym przedziale czasowym mają numer dnia 6 i 7.


ad. 1 wiem jak zrobic,
a jak ugryźć ad 2 bez tworzenia dodatkowych znaczkow w bazie?

dzieki za pomoc.
PW
Go to the top of the page
+Quote Post
dymsza
post
Post #9





Grupa: Zarejestrowani
Postów: 62
Pomógł: 4
Dołączył: 24.08.2006

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


Ja osobiście nie wiem ale mam trochę upraszczający sprawę z dodatkową tabelą temat:

otóż tworzymy tabela : |id| i wypełniamy ją od 1 do liczby która przyjmujesz za maksymalną rozpiętość daty.

  1. SELECT count(*) FROM tabela_z_datami WHERE DAYOFWEEK( ADDDATE(data1,tabela_z_datami.id ) ) NOT IN(1,6) AND ADDDATE(data1,tabela_z_datami.id ) >= 'data1' AND ADDDATE(data1,tabela_z_datami.id ) <= 'data2' AND tabela_z_datami.id < datediff('data2','data1')


jak widać zapytanie nie wygląda szczególniej grożenie i wydaje mi się ze będzie działać dobrze. Jedynym ograniczeniem jest konieczność założenia maksymalnej rospiętości data czyli data2 - data1 oczywiście możesz ze spokojem zrobić tabel o maxymlnym id np. rónym maxymalnej liczbie dla integer 12 jeśli to to id będzie kluczem nie będzie miało to wpływu na wydajność zapytania.
Go to the top of the page
+Quote Post
cytrysek
post
Post #10





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 4.01.2008

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


No to znalazłem !

http://www.artfulsoftware.com/infotree/que...&bw=1280#91
użyłem procedurki:
  1. DROP FUNCTION IF EXISTS BizDateTimeDiff;
  2. //DELIMITER
  3. CREATE FUNCTION BizDateTimeDiff( d1 DATETIME, d2 DATETIME )
  4. RETURNS CHAR(30)
  5. DETERMINISTIC
  6. BEGIN DECLARE dow1, dow2, days, wknddays INT;
  7. DECLARE tdiff CHAR(10);
  8. SET dow1 = DAYOFWEEK(d1);
  9. SET dow2 = DAYOFWEEK(d2);
  10. SET tdiff = TIMEDIFF( TIME(d2), TIME(d1) );
  11. SET days = DATEDIFF(d2,d1);
  12. SET wknddays = 2 * FLOOR( days / 7 ) +
  13. IF( dow1 = 1 AND dow2 > 1, 1,
  14. IF( dow1 = 7 AND dow2 = 1, 1,
  15. IF( dow1 > 1 AND dow1 > dow2, 2,
  16. IF( dow1 < 7 AND dow2 = 7, 1, 0 )
  17. )
  18. )
  19. );
  20. SET days = FLOOR(days - wkndDays) - IF( ASCII(tdiff) = 45, 1, 0 );
  21. SET tdiff = IF( ASCII(tdiff) = 45, TIMEDIFF( '24:00:00', SUBSTRING(tdiff,2)), TIMEDIFF( tdiff, '00:00:00' ));
  22. RETURN CONCAT( days, ' days ', tdiff );
  23. END;
  24.  
  25. DELIMITER ;

a potem juz tylko proste zapytanie :
  1. SELECT BizDateTimeDiff( '2007-1-1 00:00:00', '2007-3-31 00:00:00' ) AS dtdiff;


i działa super.
nawet nie wiedziałem, że takie cuda można w mysql.
Mam pytanie, czy taka procedura będzie juz ustawiona na stałe (wrzuciłemją spod konsoli), czy np po restarcie bazy już nie zadziała?

Czy ma ktos pomysł jak ją rozszerzyć, by dodac jeszcze święta ?


pzdr.
PW
Go to the top of the page
+Quote Post
sylbryka
post
Post #11





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 6.02.2010

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


Witam, tak czytam ten post - dużo skorzystałam, jestem historyczką i stwierdziłam że na odległych datach te funkcje się nie nadają
W (naszym) kalendarzu gregoriańskim
obowiązuje system:
- rok jest zwykły, jeśli nie dzieli się przez 4
- rok jest przestępny, jeżeli dzieli się przez 4,
wyjątek:
- jeżeli dzieli się przez 100 a nie jest
podzielny przez 400 to jest zwykły.
A gregoriański istnieje dopiero od 15 października 1582, wcześniej stosowali inny kalendarz Juliański (i inny system roku przestępnego) różniący się 10 dni, i zaraz po 5 października nastał 15 października - a tego niestety w funkcjach nie uwzględniają, do długich dat się nie nadaje.

Najlepiej właśnie przeliczyć te daty na system liczb w zapisie dni juliańskich i odciąć je od siebie.
algorytm liczenia dni juliańskich:
http://cybermoon.w.interia.pl/wiedza/algor...julian_day.html
i jak obliczyć:
http://cybermoon.w.interia.pl/wiedza/algor...legle_daty.html
Go to the top of the page
+Quote Post
Mchl
post
Post #12





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Kilka słów o kolendarzu MySQLa

http://dev.mysql.com/doc/refman/5.0/en/mysql-calendar.html
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 10:23