簡體   English   中英

如何檢查給定的日期段在MySQL和PHP中的兩個日期之間

[英]How to check given date period is between two dates in MySQL and PHP

我有該員工的旅行記錄。 我想檢查特定月份的時間,他是在戶外(出差)還是在辦公室,以計算出旅行的小時數。 只是我們要維護差旅數據庫,因為我們輸入了帶差旅地點和回程日期的客戶地點的員工姓名。

一名員工具有以下數據:

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

因此,在這里,我想檢查一下十月份所有不在辦公室的員工。 顯然,這個人應該屬於該類別,但我無法理解他。
我也直接在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工作台:

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  |
+---+----+---------------+------+-----+-----------------+-----------------+-----------------+
SELECT * FROM employeetravelrecords
WHERE
        return_date >= '2015-10-01' /* start parameter */
    and travel_date <= '2015-10-31' /* end parameter */

邏輯乍一看似乎有些曲折,我什至從上面的原始評論中對比較進行了重新排序。 這樣想:您需要在范圍開始之后返回而在范圍結束之前離開才能重疊。

對於更長的解釋和討論,您可能會發現此頁面有用: TestIfDateRangesOverlap

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

您可以使用介於之間來獲取兩個日期之間的數據。 這是工作示例。

這是我的表結構:

表用戶

 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

您想查找所有在整個持續時間內都不可用的人員,例如T1和T2(以及T2> T1)之間。 您使用的查詢將僅向用戶提供其開始日期和返回日期都在給定間隔之間的用戶,而該間隔不是必需的輸出。

因此,要獲得所需的輸出,您需要檢查所有在T1或之前開始旅程並且返回日期在T2或之后(因此在整個間隔[T1,T2]中均不可用)的所有員工。 因此,您可以使用的查詢是:

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

如果您希望在給定期間內甚至部分不可用的員工,那么我們需要那些在T1之前開始旅行並且返回日期晚於T1的員工(因此使他們在給定間隔的至少一部分時間內不可用):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM