我提出了一个相对简单的解决方案,用于计算完整临时日期的时差。但是,使用 mysql 计算开始和结束日期的时间差有点麻烦。我已将它们包含在我的解决方案中,但有一些假设。
无论如何,这是sql
SET @startdate:='2012-12-24 17:00:00';
SET @enddate:='2013-01-02 12:00:00';
SELECT
TIME_TO_SEC(TIMEDIFF(CONCAT(DATE(@startdate),' 17:30:00'), @startdate))/3600 as startday_time,
TIME_TO_SEC(TIMEDIFF(@enddate, CONCAT(DATE(@enddate),' 9:00:00')))/3600 as endday_time,
SUM(daily_hours) as otherdays_time from
(
SELECT 7.5 as daily_hours, id, DATE_ADD(DATE(@startdate),INTERVAL id-1 DAY) as idate from numbers
) dates
LEFT JOIN holidays on DATE(dates.idate) = DATE(holidays.date)
WHERE
idate BETWEEN @startdate AND @enddate
AND holidays.date IS NULL
AND DAYOFWEEK(idate) <> 7 AND DAYOFWEEK(idate) <> 1;
sqlfiddle在这里:
http ://sqlfiddle.com/#!2/ff3f3/1/2
为了获得有效的临时日期,我们需要两个表 - 一个holidays
列出所有假期日期的numbers
表和一个包含一系列整数的表,这对于连接以获得一系列连续的日期(没有间隙)非常有用。
注意:在 sqlfiddle 中,我numbers
只将表格填充到 12 以涵盖我的示例中使用的日期 - 根据您将使用的日期范围,它可能需要填充到更高的数字。
对于开始时间和结束时间,我做了以下假设:
- 开始日期和结束日期都是应计入总时间的有效日期
- 开始日期的时间在午餐和 17.30 之间
- 结束日期的时间在午餐和 17.30 之间
如果这些假设是错误的,那么您将进入严重的条件领域(有很多 if),并且可能最好在 php(或其他)中这样做。
注意:出于说明目的,我没有添加时间(以小时为单位)。