2016-05-13 294 views
0

我每週都會獲得旅行詳情,並計算他在客戶端所花費的工作時間。以下我有一位從2016年4月3日到2016年4月30日外出旅行的員工。該月的可用記錄那個員工只有一個。通過比較mysql中的兩個日期獲取數據

43 3 International Moho Nether 2016-04-03 14:29:12 2016-04-30 14:29:12 Demo 

只是我想逐周檢索記錄。所以我嘗試了一個查詢,它在某些日期返回行,有時不會。 只是我用這一週的日期試了這三個查詢。

//Last week of april (25th Apr to 1st May) 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) >= '2016-04-25' and date(return_date) <= '2016-05-01'); //0 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) <= '2016-04-25' or '2016-05-01' <= date(return_date)); //1 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and ((date(travel_date) >= '2016-04-25' and date(travel_date) <= '2016-05-01') or (date(return_date) >= '2016-04-25' and date(return_date) <= '2016-05-01')); //1 row(s) returned 

//Fourth week (18th Apr to 24th Apr) 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) >= '2016-04-18' and date(return_date) <= '2016-04-24'); //0 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) <= '2016-04-18' or '2016-04-24' <= date(return_date)); //1 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and ((date(travel_date) >= '2016-04-18' and date(travel_date) <= '2016-04-24') or (date(return_date) >= '2016-04-18' and date(return_date) <= '2016-04-24')); //0 row(s) returned 

//Third week (11th Apr to 17th Apr) 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) >= '2016-04-11' and date(return_date) <= '2016-04-17'); //0 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) <= '2016-04-11' or '2016-04-17' <= date(return_date)); //1 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and ((date(travel_date) >= '2016-04-11' and date(travel_date) <= '2016-04-17') or (date(return_date) >= '2016-04-11' and date(return_date) <= '2016-04-17')); //0 row(s) returned 

//Sec week (4th Apr to 10th Apr) 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) >= '2016-04-04' and date(return_date) <= '2016-04-10'); //0 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) <= '2016-04-04' or '2016-04-10' <= date(return_date)); //1 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and ((date(travel_date) >= '2016-04-04' and date(travel_date) <= '2016-04-10') or (date(return_date) >= '2016-04-04' and date(return_date) <= '2016-04-10')); //0 row(s) returned 

//Firs week (28th Mar to 3rd Apr) 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) >= '2016-03-28' and date(return_date) <= '2016-04-03'); //1 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) <= '2016-03-28' or '2016-04-03' <= date(return_date)); //1 row(s) returned 
SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and ((date(travel_date) >= '2016-03-28' and date(travel_date) <= '2016-04-03') or (date(return_date) >= '2016-03-28' and date(return_date) <= '2016-04-03')); //1 row(s) returned 

從上述測試中,第二個查詢可以在所有條件下工作。但是,當我在我的PHP文件中使用它時,第二個查詢在日期(4月25日到5月1日)不起作用。

PHP coding: 
///////////Employee Outstation(Travel) details///////////// 
     $employeeTravel = new EmployeeTravelRecord(); 
     $TravelEntryList = $employeeTravel->Find("employee = ? and (date(travel_date) <= ? and ? <= date(return_date))",array($employeeId,$start,$end)); 
    // $TravelEntryList = $employeeTravel->Find("employee = ? and ((travel_date >= ? and travel_date <= ?) or (return_date >= ? and return_date <= ?))",array($employeeId,$start,$end,$start,$end));  
     $startdate = $start; 
     $enddate = $end; 
     $TravelTime = 0; 
     foreach($TravelEntryList as $Travelentry){   
       $TraveldateArr = explode(" ",$Travelentry->travel_date); 
       $Traveldate = $TraveldateArr[0];     
       $ReturndateArr = explode(" ",$Travelentry->return_date); 
       $Returndate = $ReturndateArr[0];     
       if($startdate >= $Traveldate) 
       {$firstdate = $startdate; 
       } 
       else 
        $firstdate = $Traveldate; 

       if($enddate <= $Returndate) 
       { 
        $lastdate = $enddate; 
       } 
       else 
        $lastdate = $Returndate; 

       $holidays = $this->getholidays($firstdate,$lastdate); 

       $totalhours = $this->getWorkingDays($firstdate,$lastdate,$holidays);      
       $amount = $totalhours; 
       error_log("totalhours" . $totalhours); 
       $TravelTime += $amount;  
     } 

我不知道哪裏是錯誤,以便通過一週的記錄得到周,由只具有兩個日期(旅行和返回日期),哪一個是最好的?

我跟着第三個查詢讓員工一週一週地通過離開和離開樹葉來獲取樹葉。 但它在那裏正常工作。 這就是我選擇旅行記錄的原因。但這裏第三個查詢不適用於所有情況。

同樣的第二查詢返回1行本週(09May - 5月15日)

SELECT * FROM simhrmdb.employeetravelrecords where employee = 3 and (date(travel_date) <= '2016-05-09' and '2016-05-15' <= date(return_date)); 

我怎樣才能避免這種情況?

+0

結果應該是什麼樣子? – Strawberry

+0

我必須計算所需的工作時間與實際工作時間。我會從所需的總小時數中檢測出這段旅行時間,我必須從特定時期的旅行數據庫中獲取數據。 – Anu

回答

0

您正在使用or條件在您的SQL查詢(... <= '2016-04-25' or '2016-05-01' <= ...)驗證您的日期列,但在PHP腳本您正在使用AND代替或條款(... <= ? and ? <= ...)。嘗試更改條件<= ? **or** ? <=(將and替換爲or)並檢查相同。

TravelEntryList = $employeeTravel->Find("employee = ? 
and (date(travel_date) <= ? or ? <= date(return_date))",array($employeeId,$start,$end));