2016-05-13 7 views
0

Im, получая данные о поездке каждую неделю и рассчитывая рабочее время, которое он провел на месте клиента. У меня есть сотрудник, который выезжал за пределы от 03Apr2016 до 30 апреля 2016. Доступная запись за этот месяц для этого сотрудника только один.Получить данные, сравнивая две даты в 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-файле, второй запрос не работал для даты (с 25-го апреля по 01-е мая).

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 - пятнадцатый может)

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 условия для проверки столбцов даты в вашем запросе (... <= '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)); 
Смежные вопросы