2016-05-13 284 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));