2013-10-18 55 views
1

我在MySQL的三個表的日期範圍如下計數天

    從2013年9月29日至
  • 2013年10月2日
  • 從2013年10月14日至2013年-10-16
  • 從2013年10月28日至2013年11月5日

我想算只發生在10月天,例如第一範圍(2013年9月29日至2013-10-02)我應該得到兩天的時間差(10月1日和2日),並且應該忽略幾天9月份,最後,我想計算一個特定月份中日期範圍內的總天數。

可以直接從mysql查詢完成。或任何短的PHP邏輯。

這裏是我的表結構 ID,EMPLOYEE_ID,leave_start,leave_to

我要尋找一個方法的一些東西一樣

功能countLeaves($ EMPLOYEE_ID,$月) {

//代碼

回報$ numberOfLeaves }

+0

告訴我其中U從數據庫中獲取精確值... – Prafulla

+0

嘗試使用'gregoriantojd'和減去 – Razorphyn

+0

其實我想算一筆一個月內員工的葉數,所以我的方法是這樣的 '代碼' function countLeaves($ employeeId,$ month) { // mysql query + php logic return $ numberOfDays; } '代碼' –

回答

2

你需要計算月2013年10月1日的第一天,這個月的最後一天2013-10- 31,然後你可以使用這樣的查詢:

SELECT 
    DATEDIFF(
    LEAST(d_end, '2013-10-31'), 
    GREATEST(d_start, '2013-10-01'))+1 days 
FROM 
    ranges 
WHERE 
    d_start<='2013-10-31' AND d_end>='2013-10-01' 

請參閱小提琴here

+0

謝謝fthiella它解決了我的問題 –

0
$month = strtotime(date('Y-m-01', time())); 
$daysCount = (int)(time() - $month)/(24 * 3600); 

,如果你需要的任何時間段查看到任何日期:

/** 
* @var $dateFrom string Date to count from, 
* you can use date('Y-m-01') as start of current month 
* @var $dateTo string End of period date, example: '2013-09-05' 
**/ 
function getDaysCount($dateFrom, $dateTo) 
{ 
    return (int)(strtotime($dateTo) - strtotime($dateFrom))/(24 * 3600); 
} 
0

功能getAllDates($ FROM日期,$ TODATE,$ rejectmonth) { 如果($ FROM日期|| $ TODATE!){返回false;}

$dateMonthYearArr = array(); 
    $fromDateTS = strtotime($fromDate); 
    $toDateTS = strtotime($toDate); 
    for ($currentDateTS = $fromDateTS; $currentDateTS <= $toDateTS; $currentDateTS += (60 * 60 * 24)) 
    { 

     if($rejectmonth == date("m",$currentDateTS)) 
      continue; 
     $currentDateStr = date("Y-m-d",$currentDateTS); 
     $dateMonthYearArr[] = $currentDateStr; 
    } 
    return $dateMonthYearArr; 
} 

使用該函數將返回數組日期在日期範圍內。

getAllDates('2013-09-10','2013-19-10',10);