MySQL: Tarih / Times arasındaki farkı hesaplayın - sadece MF "Work hafta sırasında"

3 Cevap php

Ben bir başlangıç ​​tarih / zaman ve bitiş tarih / saat arasındaki farkı hesaplamak gerekir. Ama ben sadece 5 günlük bir çalışma haftası (gün gibi Cts / Sun hariç) için bunu yapmak istiyorum. Bunu yapmanın en iyi yolu nedir? Benim düşünce tarihinden itibaren, ben haftanın günü almak zorunda olacak ve bir hafta içi ise, o zaman ben akümülatör eklemek olmasıdır. Değilse, o zaman ben bir şey eklemek gerekmez.

Birisi önce yapmış eminim, ama ben bir şey arıyor bulmak için görünmüyor olabilir. Herhangi bir bağlantıları ya da diğer yardım çok yararlı olacaktır.

Çok teşekkürler,

Bruce

3 Cevap

DAYOFWEEK Cumartesi Pazar 1 ve 7 döndürür. Ben senin şema nasıl kurulduğuna emin değilim, ama bu bir pazartesi iki tarih bir TIMEDIFF yapacak - Cuma haftalık çalışma.

select TIMEDIFF(date1,date2) from table 
where DAYOFWEEK(date1) not in (1,7) and DAYOFWEEK(date2) not in (1,7)

MySQL DATE/TIME functions

EDIT: Bayramların hakkında Bruce'un Yorumlarınız Gönderen. Eğer tatil tarihleri ​​dolu bir tablo varsa, böyle bir şey o gün işleme dışlamak için çalışmak:

select TIMEDIFF(date1,date2) from table 
where date1 not in (select holiday from holiday_table) and
date2 not in (select holiday from holiday_table) and
DAYOFWEEK(date1) not in (1,7) and DAYOFWEEK(date2) not in (1,7)

NETWORKDAYS () "Başlangıç_tarihi ve bitiş_tarihi arasındaki tam çalışma günü sayısını döndürür. Çalışma günleri hafta sonlarını ve tatilleri belirlenen herhangi bir tarih hariç. Kullanım NETWORKDAYS belirli bir dönem boyunca çalışılan gün sayısına göre tahakkuk çalışan faydaları hesaplamak için." Excel 2007 Yardım dosyasına göre.

"Arasındaki" o başlangıç ​​ve bitiş tarihlerini, yani NETWORKDAYS (21-01-2010. 22-01-2010) = 2 içerdiğinden açıklama biraz yanlış olur. Ayrıca kez hiçbir hesap alır.

Burada aynı sonuçları verecektir PHP bir fonksiyon. Bu bitiş tarihi başlangıç ​​tarihinden daha az ise düzgün çalışmıyor, ne de (fonksiyonu aşağıya bakınız) tatilleriyle ilgili bir şey yapar.

function networkdays($startdate, $enddate)
  {
     $start_array = getdate(strtotime($startdate));
     $end_array = getdate(strtotime($enddate));

     // Make appropriate Sundays
     $start_sunday = mktime(0, 0, 0, $start_array[mon], $start_array[mday]+(7-$start_array[wday]),$start_array[year]);
     $end_sunday = mktime(0, 0, 0, $end_array[mon], $end_array[mday]- $end_array[wday],$end_array[year]);

     // Calculate days in the whole weeks
     $week_diff = $end_sunday - $start_sunday;
     $number_of_weeks = round($week_diff /604800); // 60 seconds * 60 minutes * 24 hours * 7 days = 1 week in seconds
     $days_in_whole_weeks = $number_of_weeks * 5;

     //Calculate extra days at start and end
     //[wday] is 0 (Sunday) to 7 (Saturday)
     $days_at_start = 6 - $start_array[wday];
     $days_at_end = $end_array[wday];

     $total_days = $days_in_whole_weeks + $days_at_start + $days_at_end;

     return $total_days;
}

Dikkate tatil almak için, bu fonksiyonu kullanarak gün sayısını çalışmak olurdu, o zaman böyle bir sorgu kullanmak

Select count (holiday_date) from holidays
where holiday_date between start_date and end_date
and DAYOFWEEK(holiday_date) not in (1,7)

End_date 00:00 (sabah yani ilk şey) olarak değerlendirilir ile ilgili bir sorun olmadığını dikkatli olun - bunu düzgün çalıştığını böylece 23:59:59 olması koşulu var olabilir. Bu, tüm tatil saklanır nasıl bağlıdır.

Aynı dönemde tatil dönmek ve numaradan önce düşündüm ki çıkarma.

Burada iyi bir çözüm ile bir blog yazısı için bir bağlantı - http://blog.modalonline.co.uk/2012/04/02/mysql-networkdays-function/