2016-03-23 15 views
0

Ç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 | 
+---+----+---------------+------+-----+-----------------+-----------------+-----------------+ 
+0

TestIfDateRangesOverlap ** şema yanı ** employeetravelrecords ekleyin. –

+1

Ö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

+2

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

cevap

-1

kullanabilirsiniz iki tarih arasında veri almak için. İşte çalışma örneği.

Sorgu

SELECT * FROM `user` WHERE created_date between '2015-12-01' and '2016-12-31' or modified_date between '2015-12-01' and '2016-12-31' 

Sonucu ait:

user_id user_name created_date   modified_date 
1   lalji nakum 2016-01-28 17:07:06  2016-03-31 00:00:00 
2   admin  2016-01-28 17:25:38  2016-02-29 00:00:00 

Ve işte benim MySQL sorgusu

Tablo Kullanıcı: Burada

benim masa yapıdır sorguda yukarıdaki:

Sonucu

user_id  user_name created_date   modified_date 
1   lalji nakum 2016-01-28 17:07:06  2016-03-31 00:00:00 
2   admin  2016-01-28 17:25:38  2016-02-29 00:00:00 
+0

Soruda, sizin gibi aynı sorguyu kullandığımı görebilirsiniz. Ayrıca verileriniz için '2016-02-01' ve '2016-02-28' tarihleri ​​arasında geçiş yapmaya çalıştım. Verilerinizi kullanmayı denedim, ancak işe yaramıyor. – Anu

+0

Verdiğiniz tarihte hiçbir veri yok. bu yüzden boş sonuç dönecektir. –

-1

Sen tam süresi T1 & T2 (ve T2> T1) arasında söylemek mümkün değildir bütün o insanları bulmak istiyoruz. Kullandığınız sorgu, yalnızca başlangıç ​​tarihi ve dönüş tarihi, istenen çıktı olmayan belirli aralık arasında bulunan kullanıcılara verilecektir.

İstediğiniz çıktıyı elde etmek için, T1'e başlamadan önce veya T1'den önce ve T2'den sonra veya T2'den sonra başlayan tüm çalışanları kontrol etmeniz gerekir (bu nedenle [T1, T2] aralığının tamamı için kullanılamaz).Yani kullanabilirsiniz sorgusu:

SELECT * FROM employeetravelrecords where travel_date <= '2015-10-01' and return_date >= '2015-10-31'; 

hatta kısmen verilen süre arasındaki bulunmayan çalışanları istiyorsanız ihtiyacımız T1 önce kendi seyahat başladı ve daha sonra T1 dışında herhangi dönüş tarihi olan çalışanlar (böylece onları verilen aralığın bir bölümü için en az kullanılamıyor):

SELECT * FROM employeetravelrecords where travel_date <= '2015-10-01' and return_date > '2015-10-01'; 
0
SELECT * FROM employeetravelrecords 
WHERE 
     return_date >= '2015-10-01' /* start parameter */ 
    and travel_date <= '2015-10-31' /* end parameter */ 

mantık görünüyor biraz kafa karıştıran ilk başta ve hatta karşılaştırmalar yukarıda benim orijinal yorumun biraz yeniden düzenledik. Bunu şu şekilde düşünün: aralığının başlangıcından sonra 'u geri göndermeniz ve 'u'un üst üste gelmesi için aralığın sonuna bırakmanız gerekir. Eğer kullanışlı bu sayfayı bulabileceği uzun bir açıklama ve tartışma için

:

+0

Bunlardan birinin '=' olmaması gerektiğinden şüpheleniyorum. – Strawberry

0
SELECT '2015-08-29' < '2015-10-31' AND '2015-11-06' >= '2015-10-01' on_leave; 
+----------+ 
| on_leave | 
+----------+ 
|  1 | 
+----------+ 
İlgili konular