为SQL查询添加工作日

Dim*_*tri 5 php mysql sql

我几乎无处不在地发现这一点.我有以下SQL语句:

SELECT COUNT(*) FROM `job_sheet`
LEFT JOIN deliveries ON job_sheet.job_id=deliveries.jID
WHERE job_sheet.completion=".ORDER_COMPLETE."
AND deliveries.ship_date>job_sheet.delivery_date
Run Code Online (Sandbox Code Playgroud)

这基本上告诉我哪些已完成的工作已经过去了delivery_date(DUE DATE).然而,真正的交货日期是在现实中7 企业天(节假日并不重要.基本上只是跳过周末),比前面的东西在数据库中.

我需要做的是在此部分添加7天: deliveries.ship_date>job_sheet.delivery_date + 7 business days

我的第一个想法是使用DATEADD()函数,但是我很少使用它,并且在这种情况下如何实现它很困惑.

日期存储为:YYYY-MM-DD

Dim*_*tri 1

嗯,在我的帮助下,在约会中添加 7 天是很容易的。由于我特别需要向某个日期添加 7 个工作日,因此我必须使用一些 PHP 以及脚本的其余部分。我使用自定义 DateHelper 类来完成这项工作。

class DateHelper {

    var $holidays = array("2010-07-04", "2010-09-06", "2010-09-23", "2010-10-11", "2010-11-01", "2010-11-11",  "2010-11-25", "2010-12-25");
    const oneday = 86400; 
    const weekend = 172800; 

    function addBusinessDays($start_date, $business_days)
    {

        if (date('N', $start_date) == 6)
        { // If start date is on Saturday
            $new_start_date = $start_date + self::weekend;
        } 
        elseif (date('N', $start_date) == 7)
        { // If start date is on Sunday
            $new_start_date = $start_date + self::oneday;
        } 
        else 
        {
            $new_start_date = $start_date;
        }

        $due_date = $new_start_date + $business_days * self::oneday;
        $due_date += floor($business_days / 5) * self::weekend;

        if (($business_days % 5) + date('N', $new_start_date) >= 6)
        {
            $due_date += self::weekend; // Add 2 days to compensate for the weekend
        }

        foreach($this->holidays as $holiday)
        {
            $time_stamp = strtotime($holiday);

            // If the holiday falls between the start date and end date
            // and is on a weekday
            // Or if $new_start_date is on a holiday
            if (($start_date <= $time_stamp && $time_stamp <= $due_date && date("N", $time_stamp) < 6) || date("Y-m-d", $new_start_date) == $holiday)
            {
                $due_date += self::oneday;
                if (date('N', $due_date) >= 6)
                {
                    // If due date on Saturday or Sunday
                    $due_date += self::weekend;
                }
            }
        }

        return $due_date;
    }
}
Run Code Online (Sandbox Code Playgroud)

我将这个类合并到这个:

//jobs that were shipped past their due date
public function totalShippedLate($offset = 7)
{
    $sql = mysql_query("SELECT deliveries.ship_date, job_sheet.delivery_date, deliveries.qty_shipped FROM `job_sheet` LEFT JOIN deliveries ON job_sheet.job_id=deliveries.jID WHERE job_sheet.completion=".jobInfo::ORDER_COMPLETE."") or die(mysql_error());
    $x = 0; // number of items shipped
    while($data = mysql_fetch_array($sql))
    {
        $date = new DateHelper();
        $offset_date = date("Y-m-d", $date->addBusinessDays(strtotime($data['delivery_date']), $offset));
        if($data['ship_date']>$offset_date)
        {
            $x += $data['qty_shipped']; 
        }
    }
    return $x;  
}
Run Code Online (Sandbox Code Playgroud)

这将返回超过到期日期发货的商品数量,并带有可自定义的偏移量