如何检查给定的日期是在MySQL和PHP的两个日期之间

时间:2016-03-23 04:49:57

标签: php mysql

我有该员工的旅行记录。我想在特定月份检查他是在外地(在外面旅行)还是在办公室,来计算旅行的小时数。我们正在维护旅行数据库,因为我们输入了员工姓名,旅行日期和返回日期一起旅行。

一名员工拥有以下数据:

  • 旅行日期:' 2015-08-29' (2015年8月29日)
  • 返回日期:' 2015-11-06' (2015年11月6日)

所以在这里,我想在10月份检查所有不在办公室的员工。显然这个人应该属于那个类别,但我无法得到他 我也直接在MySQL工作台上试过,但我没有得到结果。

我原来的PHP代码:

// $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;
    }
}

但是我的输入数据并没有检索到该特定员工记录,因为行程日期和返回日期都不属于我的输入日期。

MySQL Workbench:

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';

我只得到以下结果:

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

4 个答案:

答案 0 :(得分:0)

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

这个逻辑起初看起来有点令人费解,我甚至将比较与我上面的原始评论稍微重新排序。可以这样想:你需要在范围的开始之后返回并在之前在范围的结尾处离开以便重叠。

如需更长时间的解释和讨论,您可能会发现此页面非常有用:TestIfDateRangesOverlap

答案 1 :(得分:0)

var width = 300;
var height = 200;
var strokeWidth = 20;
var V1 = {x: 0, y: height};
var V2 = {x: width, y: height};
var V3 = {x: width / 2, y: 0);

答案 2 :(得分:-1)

您可以在两个日期之间使用from获取数据。这是工作示例。

这是我的表结构:

表用户

 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

这是我的mysql查询:

<强>查询

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'

以上查询的结果:

<强>结果

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

答案 3 :(得分:-1)

你想找到所有那些在T1和&amp;之间没有完整持续时间的人。 T2(和T2> T1)。您使用的查询只会为开始日期和返回日期都位于给定间隔(不是所需输出)之间的用户提供。

因此,为了获得所需的输出,您需要检查所有在T1之前或之前开始旅程的员工,并且返回日期在T2之前或之后(因此完整时间间隔[T1,T2]不可用)。因此,您可以使用的查询是:

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

如果您希望员工在给定的持续时间内部分不可用,那么我们需要在T​​1之前开始旅行并且任何返回日期晚于T1的员工(因此在给定的时间间隔内至少无法使用它们):

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