php - 检查 MySQL 中的日期范围

标签 php mysql

我正在开发美容院的预订系统。我有以下表格:

提供者 - 沙龙的工作人员。

TABLE `providers` (
  `providerId` int(11) NOT NULL AUTO_INCREMENT,
  `providerName` varchar(150) NOT NULL DEFAULT '',
  PRIMARY KEY (`providerId`)
)

101 Anna
102 Beata

服务 - 他们提供的不同服务

TABLE `services` (
  `serviceId` int(11) NOT NULL AUTO_INCREMENT,
  `service` varchar(150) NOT NULL DEFAULT '',
  `serviceDuration` int(11) NOT NULL,
  `providerId` int(11) NOT NULL,
  PRIMARY KEY (`serviceId`)
)

1   Hair cut    30  101
2   Hair coloring   120 101

时间表 - 每个提供商何时提供不同服务的表格

TABLE `schedule` (
  `scheduleId` int(11) NOT NULL AUTO_INCREMENT,
  `serviceId` int(11) NOT NULL,
  `providerId` int(11) NOT NULL,
  `scheduleStartDateTime` datetime NOT NULL,
  `scheduleEndDateTime` datetime NOT NULL,
  PRIMARY KEY (`scheduleId`)
)

1   1   101 2014-10-17 10:00:00 2014-10-17 10:29:59
2   1   101 2014-10-17 10:30:00 2014-10-17 10:59:59
3   1   101 2014-10-17 11:00:00 2014-10-17 11:29:59
4   1   101 2014-10-17 11:30:00 2014-10-17 11:59:59
5   1   101 2014-10-17 12:00:00 2014-10-17 12:29:59
6   2   101 2014-10-17 10:30:00 2014-10-17 12:29:59

最后是预订 - 已预订服务的表格。

TABLE `bookings` (
  `bookingId` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `clientId` int(11) NOT NULL,
  `bookingDate` datetime NOT NULL,
  `serviceId` int(11) NOT NULL,
  `providerId` int(11) DEFAULT NULL,
  `startDateTime` datetime NOT NULL,
  `endDateTime` datetime NOT NULL,
  PRIMARY KEY (`bookingId`)
)

1   1   2014-10-16  1   101 2014-10-17 10:30:00 2014-10-17 10:59:59

当然还有更多的客户、付款等表被加入 进入搜索。

我的问题是搜索每个提供商的未预订可用服务。

假设有人想要安娜剪头发。然后我想介绍一下可以安排的理发时间,不包括已经预订的 10:30:00。

select s.serviceId, s.providerId, s.scheduleStartDateTime, s.scheduleEndDateTime
FROM schedule AS s
WHERE s.serviceId = '1'
AND s.providerId NOT IN
(
    SELECT providerId
    FROM bookings
    WHERE startDateTime <= s.scheduleEndDateTime 
    AND endDateTime >= s.scheduleStartDateTime
)

但是这个搜索给出了这个结果:

1   101 2014-10-17 10:00:00 2014-10-17 10:29:59
1   101 2014-10-17 10:30:00 2014-10-17 10:59:59  <-- This should not show up
1   101 2014-10-17 11:00:00 2014-10-17 11:29:59
1   101 2014-10-17 11:30:00 2014-10-17 11:59:59
1   101 2014-10-17 12:00:00 2014-10-17 12:29:59

http://sqlfiddle.com/#!2/9e5f22

最佳答案

我认为你的 SQL 应该是这样的:

select s.serviceId, s.providerId, s.scheduleStartDateTime, s.scheduleEndDateTime
FROM schedule AS s
WHERE s.serviceId = '1'
AND s.providerId NOT IN
(
    SELECT b.providerId
    FROM bookings AS b
    WHERE b.startDateTime >= s.scheduleEndDateTime 
    AND b.endDateTime <= s.scheduleStartDateTime
)

子查询应该选择已预订的,因此主查询将排除这些已预订的。

阿纳斯

关于php - 检查 MySQL 中的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399609/

相关文章:

php - 如何修复 inlcude_once 在 Dreamweaver 中将 php 显示为仅输出错误?

mysql从选择查询插入返回语法错误

java - mySQL 删除行

用于处理多个连接的 PHP 脚本

php - 如何在 laravel 中按自定义时间格式排序?

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

php - 使用 PHP 脚本将 MySQL 转换为 XML

PHP 登录系统 - 当像在数据库中一样登录用户名时,将用户名设置为小

mysql - 无法创建表 - 无法添加外键约束

php - 使用MySQL进行TRIM和SUBSTRING_INDEX删除右侧的所有字符