【问题标题】:How to build a time based pricing system with overlaps如何建立一个基于时间的有重叠的定价系统
【发布时间】:2016-02-12 01:24:36
【问题描述】:

我目前正在使用 PHP (Laravel 5) 开发一个预订系统,但我不知道如何构建一个基于时间的定价系统来计算重叠的总价。预订存储在以下字段中

Reservations (Table)

begindate_time (DateTime)
enddate_time (DateTime)
price (decimal(10,2))

我有一个价格表来查找输入开始时间和结束时间的价格,如下所示:

Prices (Table)

id (INT)
price (decimal(10,2))
begin_time (time)
end_time (time)
dayOfTheWeeks (varchar(255))

begin_time/end_time 可以在 00:00:00 到 23:59:59 之间变化,而 dayOfTheWeeks 是一个包含日期的字符串,例如星期一、星期二、星期三。我知道每个字段应该只有一个值,但我懒得在一周的几天里制作一张完整的表格。

比您有一个链接到一个预订的活动,该预订根据该活动链接到 price_activity 表的时间具有不同的价格,因为价格可以有不同的活动

activity_price (Table)    

id
activity_id (INT)
price_id (INT)

我尝试像这样获取每个活动和日期的价格,然后我将它们排序并尝试循环它们并减去价格的结束时间减去预订的开始时间。这是我想出的,但它不起作用......

foreach($activity->prices()->orderBy('begin_time','asc')->get() as $price){

            $whichDayArray = explode(',',$price->dayOfTheWeeks);

            if(in_array($dayToday,$whichDayArray)){

            $prices = array();

                if(strtotime($price->end_time) > strtotime($input['begintime']) && strtotime($price->begin_time) < strtotime($input['endtime'])){
                    $prices[] = array('id' => $price->id,'price' => $price->price,'beginTimePrice' => $price->begin_time, 'endTimePrice' => $price->end_time);
                }

            }

}

这是很多代码,我的价格现在与我的预订重叠,但是我如何计算预订在价格中的时间量。我认为它可以比上面的更容易和更好。

【问题讨论】:

  • 您是否真的尝试过任何方法来解决问题,或者您只是期待一个解决方案而无需您付出任何努力?
  • @Bogdan 我更新了我的帖子!
  • 一种方法是构建一个静态表,其中包含每个小时和每个工作日(24 x 7 行)并加入其中,对与每个价格连接的行进行分组和计数(在哪一天/小时与每个价格匹配) 以确定每个价格适用的小时数。
  • @Michael-sqlbot 感谢您的评论!然而,时间不仅可以是整小时,也可以是半小时或一刻钟,甚至允许几分钟!所以问题仍然存在,您必须计算您的预订在那个小时内的分钟数,或者您必须在一天中的每一分钟插入一个表格。

标签: php mysql sql laravel laravel-5


【解决方案1】:

我已经解决了我自己的问题。希望能帮助遇到类似问题的其他人,我想解释一下我是如何解决我的问题的。

在转储我的变量并对问题进行可视化后,如下所示,我发现问题与我的查询有关。

[--pricerange1--][--pricerange2--][--pricerange2]
        [----------reservation-----------]

我必须在预订开始时间和预订结束时间之间的给定日期获取活动的所有价格,之后我必须检查是否有一个价格、两个价格或超过 2 个价格价格。然后计算预订在某个范围内的小时数,然后将其乘以范围内的价格。代码如下所示:

$begintijd = \Carbon\Carbon::createFromTime(16,30);
$eindtijd = \Carbon\Carbon::createFromTime(20,30);

$activiteit = \App\Activiteit::find(1);

$prijzen = $activiteit->prices()->where('eindtijd','>=',$begintijd->toTimeString())->where('begintijd','<=',$eindtijd->toTimeString())->orderBy('begintijd','asc')->get();

$prijzenArray = array();

foreach($prijzen as $prijs){
    $whichDayArray = explode(',',$prijs->welkedagen);
    if(in_array('maandag',$whichDayArray)){
        $prijzenArray[] = array('prijs' => $prijs->prijs,'begintijdprijs' => $prijs->begintijd,'eindtijdprijs' => $prijs->eindtijd);
    }
}

$countPrijzen = count($prijzenArray);

if($countPrijzen == 1){
    $aantaluur = $begintijd->diffInMinutes($eindtijd) / 60;
    $totaalprijs = $aantaluur * $prijzenArray[0]['prijs'];
    echo('range1');
}

if($countPrijzen == 2){
    $aantaluurrange1 = \Carbon\Carbon::createFromFormat('G:i',$prijzenArray[0]['eindtijdprijs'])->diffInMinutes($begintijd) / 60;
    $aantaluurrange2 = $eindtijd->diffInMinutes(\Carbon\Carbon::createFromFormat('G:i',$prijzenArray[0]['eindtijdprijs'])) / 60;
    $totaalprijs = ($aantaluurrange1 * $prijzenArray[0]['prijs']) + ($aantaluurrange2 * $prijzenArray[1]['prijs']);
    echo('range2');
}

if($countPrijzen > 2){
    $aantaluurrange1 = \Carbon\Carbon::createFromFormat('G:i',$prijzenArray[0]['eindtijdprijs'])->diffInMinutes($begintijd) / 60;
    $prijsrange1 = $prijzenArray[0]['prijs'] * $aantaluurrange1;

    $prijsertussen = 0;
    for($prijs=1;$prijs<($countPrijzen-1);$prijs++){
        $aantaluurertussen = \Carbon\Carbon::createFromFormat('G:i',$prijzenArray[$prijs]['eindtijdprijs'])->diffInMinutes(\Carbon\Carbon::createFromFormat('G:i',$prijzenArray[$prijs]['begintijdprijs'])) / 60;
        $prijsertussen += $prijzenArray[$prijs]['prijs'] * $aantaluurertussen;
    }

    $aantaluurlaatsterange = $eindtijd->diffInMinutes(\Carbon\Carbon::createFromFormat('G:i',$prijzenArray[$countPrijzen-1]['begintijdprijs'])) / 60;
    $prijslaatsterange = $prijzenArray[$countPrijzen-1]['prijs'] * $aantaluurlaatsterange;

    $totaalprijs = $prijsrange1 + $prijsertussen + $prijslaatsterange;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多