【问题标题】:Different price on weekdays and weekends平日和周末价格不同
【发布时间】:2016-05-02 18:31:20
【问题描述】:

我有一个 Orders 表,其中包含有关租车日期范围和租车价格的信息。

价格由:

SELECT ROUND((points * (SELECT DATEDIFF('$dateTo', '$dateFrom'))) * 0.95) AS price

$dateTo$dateFrom 是 PHP 变量,用于保存用户给定日期范围的值。换句话说:

$dateTo = $_POST['date-to'];
$dateFrom = $_POST['date-from'];

因此,您每天可以从租金中获得 5% 的折扣,但我还想检查日期范围是否跨越周六或周日。如果租金是从星期五到星期一,我想在总价上加 10 分,因为日期范围包括星期六。

这可能吗?

【问题讨论】:

  • 我有点搞不懂你说的“如果租金是从周五到周一,我想在总价上加10分,因为日期范围包括一个星期六”。为什么直到星期一而不是星期天?如果他们在周五租 1 天呢?如果他们从星期六开始租并在第二天归还怎么办?
  • @Mike - 他们只想要一个查询或代码,它可以采用日期范围并确定周末是否在该范围内。如果发生这种情况,他们需要在价格上加 10。他们只是在这种情况下给出了一个具体的例子。问题是“价格加 10”有点太笼统了,至少对我来说是这样。您是否希望修改数据库条目以便需要更新?您只想修改显示的内容吗?这种变化实际上会影响什么?
  • @MikeS 你可能是对的,但在我看来这不是一个具体的例子。
  • @MikeS 在我看来,Orders 表中的price 列是根据给定公式计算的。
  • 是的,看起来像这样,所以它实际上并没有存储在任何地方,它只是他们已经创建的查询的结果。因此,如果他们想在查询中执行此操作,则必须更改实际价格部分。我只是想知道这样做是否更好。因为你可以使用 php 来做这样的事情:stackoverflow.com/questions/9553731/…

标签: php mysql


【解决方案1】:

您可以为此目的使用存储过程,其中您的查询可能嵌套在循环内以检查它是否是工作日。 或者,您可以使用 PHP 检查日期范围内是否有周末:

<?php 

    /**
     * FUNCTION THAT CHECKS IF A WEEKEND EXISTS BETWEEN 2 GIVEN DATES
     * @param string $startDate 
     * @param string $endDate 
     * @return boolean
     */
    function dateRangeContainsWeekend($startDate, $endDate) {
        $tsDate  = strtotime($startDate);
        $diff    = date_diff(date_create($startDate), date_create($endDate));
        $dDiff   = $diff->days;

        if ($dDiff > 0) {
            for ($i = 0; $i < $dDiff; $i++) {
                $timeDiff  = 24 * 60 * 60 * $i;
                $sDate     = $tsDate + $timeDiff;
                $weekDay   = date('w', $sDate);

                if (($weekDay == 0 || $weekDay == 6)) {
                    return ($weekDay == 0 || $weekDay == 6);
                }
            }
        }
        return false;
    }

    // TESTS - - - -
    $d1 = "2016-05-02";
    $d2 = "2016-05-10";
    var_dump( dateRangeContainsWeekend($d1, $d2) );  // DUMPS true

    // NOW; IF YOU KNOW THAT THE GIVEN DATES CONTAIN A WEEKEND,
    // YOU MAY MODIFY YOUR QUERY TO REFLECT YOUR DESIRES 
    $factor = "0.95";  //CHOOSE YOUR FACTOR HERE...
    $sql    = "SELECT ROUND((points * (SELECT DATEDIFF('$dateTo', '$dateFrom'))) * $factor) AS price";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多