基于2个日期时间列检索数据 - 预留类型系统

时间:2014-09-18 13:23:37

标签: mysql datetime

这让我疯了。我已经查看了这里接受的答案,SQL command between two datetimes for table reservation,虽然它确实适用于一个实例,但它在另一个实例中不起作用。

我们假设设备#1已经安排在09:45 - 11:00之间。设备#1属于活动#1,但设备#2和设备#3以及那些2都未预订。有人想在10:00-12:00之间预订活动#1。我需要退回所有设备,无论是空闲还是忙碌。在这种情况下,设备#1将返回Busy,另外2个Free。在这种情况下,查询似乎工作正常,失败的是这种情况。

活动#2有设备#4,此活动只有一件设备可用。目前预订时间为09:30-12:00。有人想在10:00-11:00之间预订活动#2。在这种情况下,查询应该返回并说它正忙,但它在UNION的第一部分返回0行,并在第二部分返回一行,表示它是可用的。现在,当我从上面的链接帖子中添加NOT时,它可以工作,但是它不适用于第一个场景。

我对如何恰当地解决这个问题感到困惑。

希望这是有道理的。

这是我的查询。我正在做UNION所以我可以获得也没有安排的设备。

SELECT
  EventActivities.DateStart,
  EventActivities.DateEnd,
  EventActivities.EventActivityId,
  EventEquipment.FranchiseEquipmentId,
  EventActivities.EventId,
  FranchiseEquipment.Alias,
  'Busy' AS Status,
  FranchiseActivities.HourlyRate1,
  ActivityMaster.Name AS Activity
FROM EventActivities
  INNER JOIN EventEquipment
    ON EventEquipment.EventActivityId = EventActivities.EventActivityId
  INNER JOIN FranchiseEquipment
    ON EventEquipment.FranchiseEquipmentId = FranchiseEquipment.FranchiseEquipmentId
  INNER JOIN FranchiseActivities
    ON EventActivities.FranchiseActivityId = FranchiseActivities.FranchiseActivityId
  INNER JOIN ActivityMaster
    ON FranchiseActivities.MasterActivityId = ActivityMaster.ActivityMasterId
WHERE FranchiseEquipment.FranchiseId = 1
AND EventEquipment.FranchiseEquipmentId IN (2, 4, 7)
AND (EventActivities.DateStart >= '2014-10-06 10:00:00' AND EventActivities.DateStart <= '2014-10-06 11:00:00'
OR EventActivities.DateEnd >= '2014-10-06 10:00:00' AND EventActivities.DateEnd <= '2014-10-06 11:00:00')

UNION

SELECT
  NULL,
  NULL AS expr1,
  NULL AS expr2,
  FranchiseEquipment.FranchiseEquipmentId,
  NULL AS expr3,
  FranchiseEquipment.Alias,
  'Free' AS Status,
  FranchiseActivities.HourlyRate1,
  ActivityMaster.Name AS Activity
FROM FranchiseActivities_FranchiseEquipment
  INNER JOIN FranchiseEquipment
    ON FranchiseActivities_FranchiseEquipment.FranchiseEquipmentId = FranchiseEquipment.FranchiseEquipmentId
  INNER JOIN FranchiseActivities
    ON FranchiseActivities_FranchiseEquipment.FranchiseActivityId = FranchiseActivities.FranchiseActivityId
  INNER JOIN ActivityMaster
    ON FranchiseActivities.MasterActivityId = ActivityMaster.ActivityMasterId
WHERE FranchiseEquipment.FranchiseId = 1
AND FranchiseEquipment.FranchiseEquipmentId IN (2, 4, 7)
AND FranchiseEquipment.FranchiseEquipmentId NOT IN (SELECT
    EventEquipment.FranchiseEquipmentId
  FROM EventActivities
    INNER JOIN EventEquipment
      ON EventEquipment.EventActivityId = EventActivities.EventActivityId
  WHERE EventEquipment.FranchiseEquipmentId IN (2, 4, 7)
  AND (EventActivities.DateStart >= '2014-10-06 10:00:00' AND EventActivities.DateStart <= '2014-10-06 11:00:00'
  OR EventActivities.DateEnd >= '2014-10-06 10:00:00' AND EventActivities.DateEnd <= '2014-10-06 11:00:00'))
ORDER BY Alias

DDL

CREATE TABLE EventActivities (
  EventActivityId int(11) NOT NULL AUTO_INCREMENT,
  EventId int(11) NOT NULL,
  DateStart datetime NOT NULL,
  DateEnd datetime NOT NULL,
  CreatedOn datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP',
  CreatedBy int(11) NOT NULL,
  UpdatedOn datetime DEFAULT NULL,
  UpdatedBy int(11) DEFAULT NULL,
  FranchiseActivityId int(11) DEFAULT NULL,
  FranchisePackageId int(11) DEFAULT NULL,
  HourlyRate decimal(6, 2) DEFAULT NULL,
  HourlyRatePackage decimal(6, 2) DEFAULT NULL,
  HoursScheduled decimal(6, 2) DEFAULT NULL,
  PRIMARY KEY (EventActivityId),
  CONSTRAINT FK_EventActivities_Events_EventId FOREIGN KEY (EventId)
  REFERENCES Events (EventId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_EventActivities_FranchiseActivities_FranchiseActivityId FOREIGN KEY (FranchiseActivityId)
  REFERENCES FranchiseActivities (FranchiseActivityId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_EventActivities_FranchisePackages_FranchisePackageId FOREIGN KEY (FranchisePackageId)
  REFERENCES FranchisePackages (FranchisePackageId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_EventActivities_Users_UserId FOREIGN KEY (CreatedBy)
  REFERENCES Users (UserId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_EventActivitiesUpd_Users_UserId FOREIGN KEY (UpdatedBy)
  REFERENCES Users (UserId) ON DELETE NO ACTION ON UPDATE NO ACTION
)
ENGINE = INNODB
AUTO_INCREMENT = 5
AVG_ROW_LENGTH = 4096
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

CREATE TABLE EventEquipment (
  EventActivityId int(11) NOT NULL,
  FranchiseEquipmentId int(11) NOT NULL,
  CONSTRAINT FK_EventEquipment_EventActivities_EventActivityId FOREIGN KEY (EventActivityId)
  REFERENCES EventActivities (EventActivityId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_EventEquipment_FranchiseEquipment_FranchiseEquipmentId FOREIGN KEY (FranchiseEquipmentId)
  REFERENCES FranchiseEquipment (FranchiseEquipmentId) ON DELETE NO ACTION ON UPDATE NO ACTION
)
ENGINE = INNODB
AVG_ROW_LENGTH = 4096
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

CREATE TABLE FranchiseEquipment (
  FranchiseEquipmentId int(11) NOT NULL AUTO_INCREMENT,
  EquipmentMasterId int(11) NOT NULL,
  FranchiseId int(11) NOT NULL,
  Alias varchar(100) DEFAULT NULL,
  IsActive tinyint(4) NOT NULL DEFAULT 1,
  IsSuspended tinyint(4) NOT NULL DEFAULT 0,
  CreatedOn datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP',
  CreatedBy int(11) NOT NULL,
  UpdatedOn datetime DEFAULT NULL,
  UpdatedBy int(11) DEFAULT NULL,
  DeletedOn datetime DEFAULT NULL,
  DeletedBy int(11) DEFAULT NULL,
  PRIMARY KEY (FranchiseEquipmentId),
  CONSTRAINT FK_Equipment_EquipmentMaster_EquipmentMasterId FOREIGN KEY (EquipmentMasterId)
  REFERENCES EquipmentMaster (EquipmentMasterId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_Equipment_Franchises_FranchiseId FOREIGN KEY (FranchiseId)
  REFERENCES Franchises (FranchiseId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_Equipment_Users_UserId FOREIGN KEY (CreatedBy)
  REFERENCES Users (UserId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_EquipmentDel_Users_UserId FOREIGN KEY (DeletedBy)
  REFERENCES Users (UserId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_EquipmentUpd_Users_UserId FOREIGN KEY (UpdatedBy)
  REFERENCES Users (UserId) ON DELETE NO ACTION ON UPDATE NO ACTION
)
ENGINE = INNODB
AUTO_INCREMENT = 8
AVG_ROW_LENGTH = 2730
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

CREATE TABLE FranchiseActivities (
  FranchiseActivityId int(11) NOT NULL AUTO_INCREMENT,
  MasterActivityId int(11) NOT NULL,
  FranchiseId int(11) NOT NULL,
  IsActive tinyint(4) NOT NULL DEFAULT 1,
  UpdatedOn datetime DEFAULT NULL,
  UpdatedBy int(11) DEFAULT NULL,
  DeletedOn datetime DEFAULT NULL,
  DeletedBy int(11) DEFAULT NULL,
  HourlyRate1 decimal(6, 2) NOT NULL DEFAULT 0.00,
  HourlyRate2 decimal(6, 2) NOT NULL DEFAULT 0.00,
  HourlyRate3 decimal(6, 2) NOT NULL DEFAULT 0.00,
  PRIMARY KEY (FranchiseActivityId),
  CONSTRAINT FK_FranActivities_Franchises_FranchiseId FOREIGN KEY (FranchiseId)
  REFERENCES Franchises (FranchiseId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_FranActivitiesDel_Users_UserId FOREIGN KEY (DeletedBy)
  REFERENCES Users (UserId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_FranActivitiesUpd_Users_UserId FOREIGN KEY (UpdatedBy)
  REFERENCES Users (UserId) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT FK_FranchiseActivities_ActivityMaster_ActivityMasterId FOREIGN KEY (MasterActivityId)
  REFERENCES ActivityMaster (ActivityMasterId) ON DELETE NO ACTION ON UPDATE NO ACTION
)
ENGINE = INNODB
AUTO_INCREMENT = 6
AVG_ROW_LENGTH = 3276
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

CREATE TABLE ActivityMaster (
  ActivityMasterId int(11) NOT NULL AUTO_INCREMENT,
  Name varchar(75) NOT NULL,
  IsActive tinyint(4) NOT NULL DEFAULT 0,
  CreatedOn datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP',
  CreatedBy int(11) NOT NULL,
  UpdatedOn datetime DEFAULT NULL,
  UpdatedBy int(11) DEFAULT NULL,
  PRIMARY KEY (ActivityMasterId)
)
ENGINE = INNODB
AUTO_INCREMENT = 6
AVG_ROW_LENGTH = 4096
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

1 个答案:

答案 0 :(得分:0)

好的,我想我从这个网站弄明白了。 Is a given booking period available?

我的新查询如下

SELECT
  EventActivities.DateStart,
  EventActivities.DateEnd,
  EventActivities.EventActivityId,
  EventEquipment.FranchiseEquipmentId,
  EventActivities.EventId,
  FranchiseEquipment.Alias,
  'Busy' AS Status,
  FranchiseActivities.HourlyRate1,
  ActivityMaster.Name AS Activity
FROM EventActivities
  INNER JOIN EventEquipment
    ON EventEquipment.EventActivityId = EventActivities.EventActivityId
  INNER JOIN FranchiseEquipment
    ON EventEquipment.FranchiseEquipmentId = FranchiseEquipment.FranchiseEquipmentId
  INNER JOIN FranchiseActivities
    ON EventActivities.FranchiseActivityId = FranchiseActivities.FranchiseActivityId
  INNER JOIN ActivityMaster
    ON FranchiseActivities.MasterActivityId = ActivityMaster.ActivityMasterId
WHERE FranchiseEquipment.FranchiseId = 1
AND EventEquipment.FranchiseEquipmentId IN (2,4,7)
AND 
  (EventActivities.DateStart < '2014-10-06 17:00:00' AND EventActivities.DateEnd > '2014-10-06 09:00:00')


UNION

SELECT
  NULL,
  NULL AS expr1,
  NULL AS expr2,
  FranchiseEquipment.FranchiseEquipmentId,
  NULL AS expr3,
  FranchiseEquipment.Alias,
  'Free' AS Status,
  FranchiseActivities.HourlyRate1,
  ActivityMaster.Name AS Activity
FROM FranchiseActivities_FranchiseEquipment
  INNER JOIN FranchiseEquipment
    ON FranchiseActivities_FranchiseEquipment.FranchiseEquipmentId = FranchiseEquipment.FranchiseEquipmentId
  INNER JOIN FranchiseActivities
    ON FranchiseActivities_FranchiseEquipment.FranchiseActivityId = FranchiseActivities.FranchiseActivityId
  INNER JOIN ActivityMaster
    ON FranchiseActivities.MasterActivityId = ActivityMaster.ActivityMasterId
WHERE FranchiseEquipment.FranchiseId = 1
AND FranchiseEquipment.FranchiseEquipmentId IN (2,4,7)
AND FranchiseEquipment.FranchiseEquipmentId NOT IN (SELECT
    EventEquipment.FranchiseEquipmentId
  FROM EventActivities
    INNER JOIN EventEquipment
      ON EventEquipment.EventActivityId = EventActivities.EventActivityId
  WHERE EventEquipment.FranchiseEquipmentId IN (2,4,7)
  AND   (EventActivities.DateStart < '2014-10-06 17:00:00' AND EventActivities.DateEnd > '2014-10-06 09:00:00'))
ORDER BY Alias