Çalışanın seyahat geçmişine sahibim. Belirli bir ay boyunca, dışarıda (dışarıda) ya da ofiste kaç saatte olduğunu hesaplamak istiyorum. Sadece seyahat veri tabanını sürdürüyoruz, seyahat tarihine ve iade tarihine kadar gidilen müşteri yeri ile birlikte çalışan ismini girdik.Verilen tarih aralığı nasıl kontrol edilir MySQL ve PHP'de iki tarih arasındadır
Bir çalışanın şu veriler var:
- gitti tarihi: '2015/08/29' (2015 29 Ağustos)
- döndürdü tarihi: '2015/11/06' (2015 Kasım 6)
Burada, ofis dışında olan tüm çalışanlarını Ekim ayı içinde kontrol etmek istiyorum. Açıkçası bu adam o kategoriye girmeli, ama onu alamadım.
Doğrudan MySQL çalışma tezgahında da denedim, ancak sonucu almadım.
Benim orijinal PHP kodu:
// $req['date_start'] = '2015-10-01'
// $req['date_end'] = '2015-10-31'
$employeeTravel = new EmployeeTravelRecord();
$TravelEntryList = $employeeTravel->Find("(travel_date between ? and ? or return_date between ? and ?)",array($req['date_start'], $req['date_end'],$req['date_start'], $req['date_end']));
$startdate = $req['date_start'];
$enddate = $req['date_end'];
foreach($TravelEntryList as $Travelentry){
$key = $Travelentry->employee;
if($startdate >= $Travelentry->travel_date)
{
$firstdate = $startdate;
}
else
$firstdate = $Travelentry->travel_date;
if($enddate <= $Travelentry->return_date)
{
$lastdate = $enddate;
}
else
$lastdate = $Travelentry->return_date;
$holidays = $this->getholidays($firstdate,$lastdate);
$totalhours = $this->getWorkingDays($firstdate,$lastdate,$holidays); //It returns in total time of outstation in hours excluding company holidays
$amount = $totalhours;
if(isset($TravelTimeArray[$key])){
$TravelTimeArray[$key] += $amount;
}else{
$TravelTimeArray[$key] = $amount;
}
}
Ancak her iki tarih gitti ve benim giriş tarihleri düşmemesi tarihi döndürdüğü için benim giriş veri, söz konusu çalışanın kaydını almak değil.
MySQL tezgah:
SELECT * FROM employeetravelrecords where travel_date between '2015-10-01' and '2015-10-31' or return_date between '2015-10-01' and '2015-10-31';
Sadece şu sonuç var:
aşağıdaki kayıt bu sorgu tarafından alınan alamadım+----+----------+---------------+----------------+----------+------------------+------------------+----------------+
| id | employee | type | project | place | travel date | return date | details |
+----+----------+---------------+----------------+----------+------------------+------------------+----------------+
| 13 | 38 | International | PVMTC Training | Hongkong | 11/10/2015 13:33 | 28/11/2015 13:33 | PVMTC Training |
| 14 | 48 | International | PVMT | VIETNAM | 10/10/2015 9:28 | 1/1/2016 9:28 | PETRO |
| 17 | 57 | International | PVMT | Saudi | 10/10/2015 11:39 | 2/1/2016 11:39 | |
+----+----------+---------------+----------------+----------+------------------+------------------+----------------+
:
+---+----+---------------+------+-----+-----------------+-----------------+-----------------+
| 7 | 22 | International | MOHO | XYZ | 29/8/2015 18:00 | 6/11/2015 18:00 | FOR DDS review |
+---+----+---------------+------+-----+-----------------+-----------------+-----------------+
TestIfDateRangesOverlap ** şema yanı ** employeetravelrecords ekleyin. –
Örtüşmeyi test etmeniz gerekiyor. Yazılı durumunuz, ekim ayında gerçekten başladığını veya sona ermesini gerektiriyor. 'travel_date <=? end ve? start <= return_date' – shawnt00
Eh,' 29/8/2015' '' 2015-10-01 've' 2015-10-31'' ve '6/11/2015 arasında değil '' 2015-10-01 've' 2015-10-31 'arasında değil. Öyleyse neden ortaya çıkmalı? Sorgu ölçütlerinizi karşılamıyor. – Sean