我需要计算开始日期/时间和结束日期/时间之间的差异。但是,我只想在一周工作5天的情况下这样做(不包括周六/周日)。做这件事最好的方法是什么?我的想法是,从日期开始,我必须获得星期几,如果是工作日,则将累加器相加。如果不是,那么我不会添加任何东西。
我相信以前有人这样做过,但我似乎找不到任何搜索的东西。任何链接或其他帮助都会非常有用。
非常感谢,
布鲁斯
发布于 2010-02-08 15:26:30
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)
发布于 2010-02-08 18:24:59
NETWORKDAYS()“返回start_date和end_date之间的整个工作日的天数。工作日不包括周末和假日中标识的任何日期。使用NETWORKDAYS计算基于特定期限内的工作天数累计的员工福利。”根据Excel2007帮助文件。
“介于”的描述有点不准确,因为它包括开始和结束日期,即networkday(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,以便它正常工作。这完全取决于你的假期是如何存储的。
返回同一时间段内的假期,并从您最初想到的数字中减去它。
https://stackoverflow.com/questions/2222563
复制