MySQL:计算日期/时间之间的差异 - 仅在M-F“工作周”期间

时间:2010-02-08 15:23:09

标签: php mysql datetime

我需要计算开始日期/时间和结束日期/时间之间的差异。但是,我只想为5天的工作周做这件事(不包括周六/周日)。做这个的最好方式是什么?我的想法是,从那天开始,我将得到星期几,如果是工作日,那么我就加入累加器。如果不是,那我就不添加任何内容。

我确定之前有人这样做过,但我似乎无法找到任何搜索内容。任何链接或其他帮助都非常有用。

非常感谢,

布鲁斯

2 个答案:

答案 0 :(得分:4)

DAYOFWEEK周日返回1,星期六返回7。我不确定您的架构是如何设置的,但这将执行周二 - 周五工作周的两个日期的TIMEDIFF。

select TIMEDIFF(date1,date2) from table 
where DAYOFWEEK(date1) not in (1,7) and DAYOFWEEK(date2) not in (1,7)

MySQL DATE/TIME functions

编辑:来自布鲁斯关于假期的评论。如果你有一个充满假期日期的表格,那么这样的事情可以排除那些日子的处理:

select TIMEDIFF(date1,date2) from table 
where date1 not in (select holiday from holiday_table) and
date2 not in (select holiday from holiday_table) and
DAYOFWEEK(date1) not in (1,7) and DAYOFWEEK(date2) not in (1,7)

答案 1 :(得分:2)

NETWORKDAYS()“返回start_date和end_date之间的整个工作日数。工作日不包括周末和假日中确定的任何日期。使用NETWORKDAYS计算根据特定学期的工作天数累积的员工福利。 “根据Excel 2007帮助文件。

“之间”描述有点不准确,因为它包括开始和结束日期,即networkdays(21-01-2010.22-01-2010)= 2.它也不考虑时间。

这是PHP中的一个函数,可以提供相同的结果。如果结束日期小于开始日期,则无法正常工作,也不会对假期做任何事情(请参阅下面的函数)。

function networkdays($startdate, $enddate)
  {
     $start_array = getdate(strtotime($startdate));
     $end_array = getdate(strtotime($enddate));

     // Make appropriate Sundays
     $start_sunday = mktime(0, 0, 0, $start_array[mon], $start_array[mday]+(7-$start_array[wday]),$start_array[year]);
     $end_sunday = mktime(0, 0, 0, $end_array[mon], $end_array[mday]- $end_array[wday],$end_array[year]);

     // Calculate days in the whole weeks
     $week_diff = $end_sunday - $start_sunday;
     $number_of_weeks = round($week_diff /604800); // 60 seconds * 60 minutes * 24 hours * 7 days = 1 week in seconds
     $days_in_whole_weeks = $number_of_weeks * 5;

     //Calculate extra days at start and end
     //[wday] is 0 (Sunday) to 7 (Saturday)
     $days_at_start = 6 - $start_array[wday];
     $days_at_end = $end_array[wday];

     $total_days = $days_in_whole_weeks + $days_at_start + $days_at_end;

     return $total_days;
}

要考虑假期,您必须计算使用此功能的天数,然后使用类似

的查询
Select count (holiday_date) from holidays
where holiday_date between start_date and end_date
and DAYOFWEEK(holiday_date) not in (1,7)

请注意,end_date被视为00:00(即早上的第一件事)没有问题 - 您可能必须将其调整为23:59:59才能使其正常工作。这一切都取决于你的假期存储方式。

要在同一时间段内返回假期,并从您最初想到的数字中减去该假期。