我需要计算开始日期/时间和结束日期/时间之间的差异。但是,我只想为5天的工作周做这件事(不包括周六/周日)。做这个的最好方式是什么?我的想法是,从那天开始,我将得到星期几,如果是工作日,那么我就加入累加器。如果不是,那我就不添加任何内容。
我确定之前有人这样做过,但我似乎无法找到任何搜索内容。任何链接或其他帮助都非常有用。
非常感谢,
布鲁斯
答案 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)
编辑:来自布鲁斯关于假期的评论。如果你有一个充满假期日期的表格,那么这样的事情可以排除那些日子的处理:
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才能使其正常工作。这一切都取决于你的假期存储方式。
要在同一时间段内返回假期,并从您最初想到的数字中减去该假期。