【问题标题】:mysql query to find available car for booking between date range with continuous daymysql查询以查找日期范围与连续天之间的可用汽车预订
【发布时间】:2018-04-02 14:26:41
【问题描述】:

我正在尝试开发汽车租赁系统。以下是我的数据库表架构

CREATE TABLE IF NOT EXISTS `s_leases` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
`vehicle_id` int(11) NOT NULL, 
`start_date` date DEFAULT NULL,
 `end_date` date DEFAULT NULL
) ;

样本数据

INSERT INTO `cs_leases` 
(`id`, `vehicle_id`,  `start_date` `end_date`) VALUES
(1, 1, '2018-03-07', '2018-03-12'),
(2, 1,  '2018-03-17', '2018-03-21'),
(3, 1,  '2018-03-24', '2018-03-30'),
(4, 3,  '2018-03-07', '2018-03-10'),
(5, 3, '2018-03-12', '2018-03-15')

上表包含租车数据

CREATE TABLE IF NOT EXISTS `cs_lease_availabilities` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`lease_id` int(11) NOT NULL,
`vehicle_id` int(11) NOT NULL,
`date` date DEFAULT NULL,
`start_time` varchar(25) DEFAULT NULL,
`end_time` varchar(25) DEFAULT NULL
);

样本数据:

INSERT INTO `cs_lease_availabilities` 
(`id`, `lease_id`,`vehicle_id`, `date`, `start_time`, `end_time`,`status`) VALUES
(1, 1, 1,  '2018-03-07', '09:50 AM', '12:50 PM', 0),
(2, 1, 1,  '2018-03-08', '01:51 PM', '04:50 PM',0),
(3, 1, 1,  '2018-03-09', '01:06 PM', '10:00 PM',0),
(4, 1, 1, '2018-03-10', '09:00 AM', '10:00 AM', 0),
(5, 1, 1,  '2018-03-11', '08:00 AM', '10:00 PM', 0),
(6, 1, 1,  '2018-03-12', '12:00 PM', '10:00 PM',0),
(7,2, 1,  '2018-03-17', '00:01 AM', '11:59 PM', 0),
(8, 2, 1, '2018-03-18', '00:01 AM', '11:59 PM', 0),
(9, 2, 1,  '2018-03-19', '00:01 AM', '11:59 PM',0),
(10, 2, 1, '2018-03-20', '00:01 AM', '11:59 PM', 0),
(11, 2, 1, '2018-03-21', '00:01 AM', '11:59 PM',0),
(12, 3, 1,  '2018-03-24', '00:01 AM', '11:59 PM',0),
(13, 3, 1,  '2018-03-25', '00:01 AM', '11:59 PM', 0),
(14, 3, 1,  '2018-03-26', '00:01 AM', '11:59 PM',0),
(15, 3, 1, '2018-03-27', '00:01 AM', '11:59 PM', 0),
(16, 3, 1,  '2018-03-28', '00:01 AM', '11:59 PM',0),
(17, 3, 1, '2018-03-29', '00:01 AM', '11:59 PM', 0),
(18, 3, 1,  '2018-03-30', '00:01 AM', '11:59 PM',0),
(19, 4, 3, '2018-03-07', '00:01 AM', '11:59 PM', 0),
(20, 4, 3, '2018-03-08', '00:01 AM', '11:59 PM', 0),
(21, 4, 3, '2018-03-09', '00:01 AM', '11:59 PM', 0),
(22, 4, 3, '2018-03-10', '00:01 AM', '11:59 PM', 0),
(23, 5, 3, '2018-03-12', '00:01 AM', '11:59 PM', 0),
(24, 5, 3, '2018-03-13', '00:01 AM', '11:59 PM', 0),
(25, 7, 3, '2018-03-14', '00:01 AM', '11:59 PM', 0),
(26, 7, 3, '2018-03-15', '08:01 AM', '11:00 PM', 0)

上表包含每天可用的时间相关信息。

CREATE TABLE IF NOT EXISTS `cs_orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lease_id` int(11) NOT NULL,
`vehicle_id` int(11) NOT NULL,
`start_date` date NOT NULL,
`end_date` date NOT NULL,
`status` tinyint(2) NOT NULL DEFAULT '0'
);

此表保存预订相关信息

下表保存每天的预订时间信息。

CREATE TABLE IF NOT EXISTS `cs_order_availabilities` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`lease_id` int(11) NOT NULL,
`lease_availability_id` int(11) NOT NULL,
`cs_order_id` int(11) NOT NULL,
`vehicle_id` int(11) NOT NULL,
`date` date DEFAULT NULL,
`start_time` varchar(25) DEFAULT NULL,
`end_time` varchar(25) DEFAULT NULL
);

现在我正在努力构建一个 mysql 查询,该查询可以返回具有连续日期可用性的日期范围之间的可用车辆租赁记录。

如果我尝试查找 2018 年 3 月 8 日到 2018 年 3 月 15 日之间的可用日期,则不应显示任何记录(cs 租约 id 1 和 2 不是连续日期)。

任何帮助将不胜感激。

【问题讨论】:

  • 给我们样本数据和预期的工作结果。
  • 我更新了我的问题并添加了示例数据。请立即查看
  • 最重要的是,到目前为止你尝试了什么??????
  • 如果我将 2018-03-07 添加到 2018-03-09 ,那么预期的结果是什么?
  • 那么租约 #1 和 #4 都将被退回

标签: mysql sql datetime


【解决方案1】:

你可以试试,

SET @st = '2018-03-07';
SET @et = '2018-03-09';

SELECT cs.lease_id, COUNT(cs.`date`) AS ct 
FROM cs_lease_availabilities cs 
WHERE cs.`date` BETWEEN @st AND @et
GROUP BY cs.lease_id HAVING ct = TIMESTAMPDIFF(DAY , @st , @et)+1;

我希望这会返回您的预期结果。

【讨论】:

  • @Vinod kumar 你检查过这个吗?
【解决方案2】:

在确定如何查询数据之前确定架构可能不是最好的方法。

如果是我,我会使用一张桌子来保存预订和特定资源的可用性。

那么这只是一个问题......

SELECT *
FROM resource_calendar
WHERE status='available' 
AND start_time<$booking_start
AND end_time>$booking_end
ORDER BY unix_timestamp($booking_start)-unix_timestamp(start_time)

但是没有简单的方法可以优化任何架构以有效地使用常规索引。如果您想要快速查询,则需要使用geo-spatial indexing(是的,该问题涉及 IP 地址,但问题相同)

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多