获取每个项目的数据库中的2个日期之间的所有日期

时间:2017-06-10 20:14:06

标签: php mysql innodb where-clause

我正在尝试获取每辆车的数组,其中包含租用汽车的日期。

到目前为止,我有一个函数可以获取所有发票行的所有日期,而不是每辆汽车都有自己的数组。我怎样才能让它发挥作用?

我的目标是获取所选时段内可用的汽车列表,但首先我要尝试使用静态开始和结束日期。 我想要得到一个循环,它获得所有不同的车辆ID,并且对于每个车辆ID,它将创建一个包含所有日期的数组。

<?php
$start_date = '2017-06-12';
$end_date = '2017-06-14';
$items = array();

$result = mysqli_query($con, "SELECT * FROM invoice_line ");
$carid = null;
while ($car = mysqli_fetch_array($result)) {
  $carid =  $car['car_car_id'];
  echo $carid;
  //second part
  $car = mysqli_query($con, "SELECT * FROM invoice_line WHERE car_car_id = '$carid' AND start_date>='$start_date' AND end_date<='$end_date'");
  while ($car_available = mysqli_fetch_array($car)) {
  echo $car_available['car_car_id'];
  }
} // end second part

?>
<?php
function getDateRange($startDate, $endDate, $format="Y-m-d")
{
    //Create output variable
    $datesArray = array();
    //Calculate number of days in the range
    $total_days = round(abs(strtotime($endDate) - strtotime($startDate)) / 86400, 0) + 1;
    //Populate array of weekdays and counts
    for($day=0; $day<$total_days; $day++)
    {
        $datesArray[] = date($format, strtotime("{$startDate} + {$day} days"));
    }
    //Return results array
    return $datesArray;
}
?>

更新: 我根据评论将代码更改为现在的代码,而不是给我所有未使用的汽车,而是给我开始和结束日期介于$ start_date end $ end_date之间的汽车。那么我该如何使用它来获得那段时间未使用的汽车列表。在这下面是一个DB的例子,你可以看到可以是多个记录,但是在不同的时间段内可以相同。例如,如果$ start_date是2017-02-03而$ end_date是2017-02-05,则车号1和3应该在那里,但如果start_date是2017-06-11结束且日期是2017-06-13只有车号一个人应该在那里,因为这段时间内有这辆车的使用记录。

data

-- phpMyAdmin SQL Dump
-- version 4.6.4
-- https://www.phpmyadmin.net/
--
-- Host: localhost:8889
-- Generation Time: Jun 11, 2017 at 10:43 AM
-- Server version: 5.6.28
-- PHP Version: 7.0.10

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `rentacar`
--

-- --------------------------------------------------------

--
-- Table structure for table `invoice_line`
--

CREATE TABLE `invoice_line` (
  `car_car_id` int(10) UNSIGNED NOT NULL,
  `invoice_invoice_number` int(10) UNSIGNED NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `invoice_line`
--

INSERT INTO `invoice_line` (`car_car_id`, `invoice_invoice_number`, `start_date`, `end_date`) VALUES
(3, 2, '2017-06-12', '2017-06-14'),
(2, 2, '2017-06-10', '2017-06-20'),
(1, 1, '2017-06-01', '2017-06-03');

--
-- Indexes for dumped tables
--

1 个答案:

答案 0 :(得分:0)

这是描述每辆车被雇用的日期的结果:

SELECT * FROM invoice_line;
+--------+----------------+------------+------------+
| car_id | invoice_number | start_date | end_date   |
+--------+----------------+------------+------------+
|      3 |              2 | 2017-06-12 | 2017-06-14 |
|      2 |              2 | 2017-06-10 | 2017-06-20 |
|      1 |              1 | 2017-06-01 | 2017-06-03 |
+--------+----------------+------------+------------+

您可以将其转换为数组,就像其他任何结果一样。

注意我已经稍微修改了列名,以保持我的理智。