MySql query to find rooms available given dates 'From' and 'to'












0














Tables are as follows



rooms(RoomId(PK)(int),
RoomName(varchar))

bookings(RoomId(FK)(int),
From_D(date),
To_D(date),
Bookee(varchar))

(PK-primary Key ,FK-foreign Key)


Given the arrival(From_D) and departure(To_D) dates how do i find out the id of the rooms that are available



I tried:



SELECT DISTINCT RoomId 
FROM bookings
WHERE arrival not in(From_D,To_d) AND
departure not in(From_D,To_d)


But seeing the structure of my DB problem occurs if there multiple booking of a room stored in the DB, and it books the room even if it was not free in that range of dates










share|improve this question
























  • please provide sample data and your expected output in table format
    – fa06
    Nov 15 at 6:49
















0














Tables are as follows



rooms(RoomId(PK)(int),
RoomName(varchar))

bookings(RoomId(FK)(int),
From_D(date),
To_D(date),
Bookee(varchar))

(PK-primary Key ,FK-foreign Key)


Given the arrival(From_D) and departure(To_D) dates how do i find out the id of the rooms that are available



I tried:



SELECT DISTINCT RoomId 
FROM bookings
WHERE arrival not in(From_D,To_d) AND
departure not in(From_D,To_d)


But seeing the structure of my DB problem occurs if there multiple booking of a room stored in the DB, and it books the room even if it was not free in that range of dates










share|improve this question
























  • please provide sample data and your expected output in table format
    – fa06
    Nov 15 at 6:49














0












0








0


1





Tables are as follows



rooms(RoomId(PK)(int),
RoomName(varchar))

bookings(RoomId(FK)(int),
From_D(date),
To_D(date),
Bookee(varchar))

(PK-primary Key ,FK-foreign Key)


Given the arrival(From_D) and departure(To_D) dates how do i find out the id of the rooms that are available



I tried:



SELECT DISTINCT RoomId 
FROM bookings
WHERE arrival not in(From_D,To_d) AND
departure not in(From_D,To_d)


But seeing the structure of my DB problem occurs if there multiple booking of a room stored in the DB, and it books the room even if it was not free in that range of dates










share|improve this question















Tables are as follows



rooms(RoomId(PK)(int),
RoomName(varchar))

bookings(RoomId(FK)(int),
From_D(date),
To_D(date),
Bookee(varchar))

(PK-primary Key ,FK-foreign Key)


Given the arrival(From_D) and departure(To_D) dates how do i find out the id of the rooms that are available



I tried:



SELECT DISTINCT RoomId 
FROM bookings
WHERE arrival not in(From_D,To_d) AND
departure not in(From_D,To_d)


But seeing the structure of my DB problem occurs if there multiple booking of a room stored in the DB, and it books the room even if it was not free in that range of dates







mysql sql






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 15 at 11:56









Madhur Bhaiya

19.4k62236




19.4k62236










asked Nov 15 at 6:46









Tanmay Shrivastava

84




84












  • please provide sample data and your expected output in table format
    – fa06
    Nov 15 at 6:49


















  • please provide sample data and your expected output in table format
    – fa06
    Nov 15 at 6:49
















please provide sample data and your expected output in table format
– fa06
Nov 15 at 6:49




please provide sample data and your expected output in table format
– fa06
Nov 15 at 6:49












4 Answers
4






active

oldest

votes


















1














Consider the following diagram (sorry for bad handwriting):



enter image description here



In the above diagram, we can see date ranges on a horizontal axis. From_D to To_D represents a booked slot for a specific room. Four cases are considered for Arrival and Departure dates (denoted by Ai and Di).



We can clearly see that a particular room is available only when the arrival and departure dates are either completely on the left side, or the right side of the booked slot.



We can GROUP BY on RoomID and consider only those rooms, where every booking for follows the criteria defined above, using the HAVING clause.



The query would be simply the following:



SELECT RoomID 
FROM bookings
GROUP BY RoomID
HAVING
SUM((From_D < :arrival AND To_D < :arrival)
OR
(From_D > :departure AND To_D > :departure)) = COUNT(*)




Demo on DB Fiddle



CREATE TABLE `rooms` (
`RoomId` int(4) NOT NULL,
`RoomName` varchar(20) DEFAULT NULL,
PRIMARY KEY (`RoomId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `bookings` (
`RoomId` int(4) NOT NULL,
`From_D` date NOT NULL,
`To_d` date NOT NULL,
`B_Name` varchar(20) NOT NULL,
KEY `RoomId` (`RoomId`),
CONSTRAINT `bookings_ibfk_1` FOREIGN KEY (`RoomId`) REFERENCES `rooms` (`RoomId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `rooms` (`RoomId`, `RoomName`) VALUES
('1', 'Auditorium'),
('2', 'Room2'),
('3', 'Room3'),
('4', 'Room4'),
('5', 'Room5');

INSERT INTO `bookings` (`RoomId`, `From_D`, `To_d`, `B_Name`) VALUES
('1', '2018-11-01', '2018-11-03', 'Trance'),
('2', '2018-11-02', '2018-11-07', 'Alcoding'),
('3', '2018-11-01', '2018-11-04', 'DebSoc'),
('4', '2018-11-12', '2018-11-17', 'MunSoc'),
('5', '2018-11-03', '2018-11-06', 'Pulse');


Query: Check for any availability between 2018-11-01 and 2018-11-03



SELECT RoomId 
FROM bookings
GROUP BY RoomID
HAVING
SUM((From_D < '2018-11-01' AND To_D < '2018-11-01')
OR
(From_D > '2018-11-03' AND To_D > '2018-11-03')) = COUNT(*)


Result: Only RoomId 4 is available as per the sample data



| RoomId |
| ------ |
| 4 |





share|improve this answer























  • I tried running this query but it returns zero rows for dates in which some rooms are free
    – Tanmay Shrivastava
    Nov 16 at 18:42










  • @TanmayShrivastava can you please provide the SQL for the sample data in the table, in which this query is failing
    – Madhur Bhaiya
    Nov 16 at 18:44










  • SELECT DISTINCT b1.RoomId FROM bookings AS b1 WHERE NOT EXISTS ( SELECT 1 FROM bookings AS b2 WHERE b2.RoomId = b1.RoomId AND NOT('2018-11-01'< b2.From_D AND '2018-11-03' < b2.From_D) OR NOT('2018-11-01' > b2.To_D AND '2018-11-03' > b2.To_D) )
    – Tanmay Shrivastava
    Nov 16 at 18:49












  • i know that there is a room that is free between the dates given but the query returns zero results
    – Tanmay Shrivastava
    Nov 16 at 18:51






  • 1




    Done ,I have set the data up
    – Tanmay Shrivastava
    Nov 16 at 19:35



















0














Use BETWEEN and AND with your date



SELECT DISTINCT RoomId FROM bookings    
WHERE (date_field BETWEEN From_D AND To_d)





share|improve this answer































    0














    select distinct r.*
    from rooms r
    left join bookings b on b.RoomId=r.RoomId
    where b.RoomId is null or @arrival > To_D or @departure < from_td





    share|improve this answer

















    • 1




      answer with only code are poor, can you please explain what your code does?
      – DaFois
      Nov 15 at 16:53










    • What should @arrival do? That does not look like valid SQL
      – Nico Haase
      Nov 15 at 17:25



















    -1














    Try this :
    SELECT * FROM rooms room1
    WHERE NOT EXISTS (SELECT *
    FROM booking booking1
    WHERE room1.roomid = booking1.roomid AND
    (:from_d BETWEEN booking1.from_d AND booking1.to_d OR
    :to_d BETWEEN booking1.from_d AND booking1.to_d))





    share|improve this answer





















      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53313840%2fmysql-query-to-find-rooms-available-given-dates-from-and-to%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      Consider the following diagram (sorry for bad handwriting):



      enter image description here



      In the above diagram, we can see date ranges on a horizontal axis. From_D to To_D represents a booked slot for a specific room. Four cases are considered for Arrival and Departure dates (denoted by Ai and Di).



      We can clearly see that a particular room is available only when the arrival and departure dates are either completely on the left side, or the right side of the booked slot.



      We can GROUP BY on RoomID and consider only those rooms, where every booking for follows the criteria defined above, using the HAVING clause.



      The query would be simply the following:



      SELECT RoomID 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < :arrival AND To_D < :arrival)
      OR
      (From_D > :departure AND To_D > :departure)) = COUNT(*)




      Demo on DB Fiddle



      CREATE TABLE `rooms` (
      `RoomId` int(4) NOT NULL,
      `RoomName` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      CREATE TABLE `bookings` (
      `RoomId` int(4) NOT NULL,
      `From_D` date NOT NULL,
      `To_d` date NOT NULL,
      `B_Name` varchar(20) NOT NULL,
      KEY `RoomId` (`RoomId`),
      CONSTRAINT `bookings_ibfk_1` FOREIGN KEY (`RoomId`) REFERENCES `rooms` (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      INSERT INTO `rooms` (`RoomId`, `RoomName`) VALUES
      ('1', 'Auditorium'),
      ('2', 'Room2'),
      ('3', 'Room3'),
      ('4', 'Room4'),
      ('5', 'Room5');

      INSERT INTO `bookings` (`RoomId`, `From_D`, `To_d`, `B_Name`) VALUES
      ('1', '2018-11-01', '2018-11-03', 'Trance'),
      ('2', '2018-11-02', '2018-11-07', 'Alcoding'),
      ('3', '2018-11-01', '2018-11-04', 'DebSoc'),
      ('4', '2018-11-12', '2018-11-17', 'MunSoc'),
      ('5', '2018-11-03', '2018-11-06', 'Pulse');


      Query: Check for any availability between 2018-11-01 and 2018-11-03



      SELECT RoomId 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < '2018-11-01' AND To_D < '2018-11-01')
      OR
      (From_D > '2018-11-03' AND To_D > '2018-11-03')) = COUNT(*)


      Result: Only RoomId 4 is available as per the sample data



      | RoomId |
      | ------ |
      | 4 |





      share|improve this answer























      • I tried running this query but it returns zero rows for dates in which some rooms are free
        – Tanmay Shrivastava
        Nov 16 at 18:42










      • @TanmayShrivastava can you please provide the SQL for the sample data in the table, in which this query is failing
        – Madhur Bhaiya
        Nov 16 at 18:44










      • SELECT DISTINCT b1.RoomId FROM bookings AS b1 WHERE NOT EXISTS ( SELECT 1 FROM bookings AS b2 WHERE b2.RoomId = b1.RoomId AND NOT('2018-11-01'< b2.From_D AND '2018-11-03' < b2.From_D) OR NOT('2018-11-01' > b2.To_D AND '2018-11-03' > b2.To_D) )
        – Tanmay Shrivastava
        Nov 16 at 18:49












      • i know that there is a room that is free between the dates given but the query returns zero results
        – Tanmay Shrivastava
        Nov 16 at 18:51






      • 1




        Done ,I have set the data up
        – Tanmay Shrivastava
        Nov 16 at 19:35
















      1














      Consider the following diagram (sorry for bad handwriting):



      enter image description here



      In the above diagram, we can see date ranges on a horizontal axis. From_D to To_D represents a booked slot for a specific room. Four cases are considered for Arrival and Departure dates (denoted by Ai and Di).



      We can clearly see that a particular room is available only when the arrival and departure dates are either completely on the left side, or the right side of the booked slot.



      We can GROUP BY on RoomID and consider only those rooms, where every booking for follows the criteria defined above, using the HAVING clause.



      The query would be simply the following:



      SELECT RoomID 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < :arrival AND To_D < :arrival)
      OR
      (From_D > :departure AND To_D > :departure)) = COUNT(*)




      Demo on DB Fiddle



      CREATE TABLE `rooms` (
      `RoomId` int(4) NOT NULL,
      `RoomName` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      CREATE TABLE `bookings` (
      `RoomId` int(4) NOT NULL,
      `From_D` date NOT NULL,
      `To_d` date NOT NULL,
      `B_Name` varchar(20) NOT NULL,
      KEY `RoomId` (`RoomId`),
      CONSTRAINT `bookings_ibfk_1` FOREIGN KEY (`RoomId`) REFERENCES `rooms` (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      INSERT INTO `rooms` (`RoomId`, `RoomName`) VALUES
      ('1', 'Auditorium'),
      ('2', 'Room2'),
      ('3', 'Room3'),
      ('4', 'Room4'),
      ('5', 'Room5');

      INSERT INTO `bookings` (`RoomId`, `From_D`, `To_d`, `B_Name`) VALUES
      ('1', '2018-11-01', '2018-11-03', 'Trance'),
      ('2', '2018-11-02', '2018-11-07', 'Alcoding'),
      ('3', '2018-11-01', '2018-11-04', 'DebSoc'),
      ('4', '2018-11-12', '2018-11-17', 'MunSoc'),
      ('5', '2018-11-03', '2018-11-06', 'Pulse');


      Query: Check for any availability between 2018-11-01 and 2018-11-03



      SELECT RoomId 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < '2018-11-01' AND To_D < '2018-11-01')
      OR
      (From_D > '2018-11-03' AND To_D > '2018-11-03')) = COUNT(*)


      Result: Only RoomId 4 is available as per the sample data



      | RoomId |
      | ------ |
      | 4 |





      share|improve this answer























      • I tried running this query but it returns zero rows for dates in which some rooms are free
        – Tanmay Shrivastava
        Nov 16 at 18:42










      • @TanmayShrivastava can you please provide the SQL for the sample data in the table, in which this query is failing
        – Madhur Bhaiya
        Nov 16 at 18:44










      • SELECT DISTINCT b1.RoomId FROM bookings AS b1 WHERE NOT EXISTS ( SELECT 1 FROM bookings AS b2 WHERE b2.RoomId = b1.RoomId AND NOT('2018-11-01'< b2.From_D AND '2018-11-03' < b2.From_D) OR NOT('2018-11-01' > b2.To_D AND '2018-11-03' > b2.To_D) )
        – Tanmay Shrivastava
        Nov 16 at 18:49












      • i know that there is a room that is free between the dates given but the query returns zero results
        – Tanmay Shrivastava
        Nov 16 at 18:51






      • 1




        Done ,I have set the data up
        – Tanmay Shrivastava
        Nov 16 at 19:35














      1












      1








      1






      Consider the following diagram (sorry for bad handwriting):



      enter image description here



      In the above diagram, we can see date ranges on a horizontal axis. From_D to To_D represents a booked slot for a specific room. Four cases are considered for Arrival and Departure dates (denoted by Ai and Di).



      We can clearly see that a particular room is available only when the arrival and departure dates are either completely on the left side, or the right side of the booked slot.



      We can GROUP BY on RoomID and consider only those rooms, where every booking for follows the criteria defined above, using the HAVING clause.



      The query would be simply the following:



      SELECT RoomID 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < :arrival AND To_D < :arrival)
      OR
      (From_D > :departure AND To_D > :departure)) = COUNT(*)




      Demo on DB Fiddle



      CREATE TABLE `rooms` (
      `RoomId` int(4) NOT NULL,
      `RoomName` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      CREATE TABLE `bookings` (
      `RoomId` int(4) NOT NULL,
      `From_D` date NOT NULL,
      `To_d` date NOT NULL,
      `B_Name` varchar(20) NOT NULL,
      KEY `RoomId` (`RoomId`),
      CONSTRAINT `bookings_ibfk_1` FOREIGN KEY (`RoomId`) REFERENCES `rooms` (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      INSERT INTO `rooms` (`RoomId`, `RoomName`) VALUES
      ('1', 'Auditorium'),
      ('2', 'Room2'),
      ('3', 'Room3'),
      ('4', 'Room4'),
      ('5', 'Room5');

      INSERT INTO `bookings` (`RoomId`, `From_D`, `To_d`, `B_Name`) VALUES
      ('1', '2018-11-01', '2018-11-03', 'Trance'),
      ('2', '2018-11-02', '2018-11-07', 'Alcoding'),
      ('3', '2018-11-01', '2018-11-04', 'DebSoc'),
      ('4', '2018-11-12', '2018-11-17', 'MunSoc'),
      ('5', '2018-11-03', '2018-11-06', 'Pulse');


      Query: Check for any availability between 2018-11-01 and 2018-11-03



      SELECT RoomId 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < '2018-11-01' AND To_D < '2018-11-01')
      OR
      (From_D > '2018-11-03' AND To_D > '2018-11-03')) = COUNT(*)


      Result: Only RoomId 4 is available as per the sample data



      | RoomId |
      | ------ |
      | 4 |





      share|improve this answer














      Consider the following diagram (sorry for bad handwriting):



      enter image description here



      In the above diagram, we can see date ranges on a horizontal axis. From_D to To_D represents a booked slot for a specific room. Four cases are considered for Arrival and Departure dates (denoted by Ai and Di).



      We can clearly see that a particular room is available only when the arrival and departure dates are either completely on the left side, or the right side of the booked slot.



      We can GROUP BY on RoomID and consider only those rooms, where every booking for follows the criteria defined above, using the HAVING clause.



      The query would be simply the following:



      SELECT RoomID 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < :arrival AND To_D < :arrival)
      OR
      (From_D > :departure AND To_D > :departure)) = COUNT(*)




      Demo on DB Fiddle



      CREATE TABLE `rooms` (
      `RoomId` int(4) NOT NULL,
      `RoomName` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      CREATE TABLE `bookings` (
      `RoomId` int(4) NOT NULL,
      `From_D` date NOT NULL,
      `To_d` date NOT NULL,
      `B_Name` varchar(20) NOT NULL,
      KEY `RoomId` (`RoomId`),
      CONSTRAINT `bookings_ibfk_1` FOREIGN KEY (`RoomId`) REFERENCES `rooms` (`RoomId`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      INSERT INTO `rooms` (`RoomId`, `RoomName`) VALUES
      ('1', 'Auditorium'),
      ('2', 'Room2'),
      ('3', 'Room3'),
      ('4', 'Room4'),
      ('5', 'Room5');

      INSERT INTO `bookings` (`RoomId`, `From_D`, `To_d`, `B_Name`) VALUES
      ('1', '2018-11-01', '2018-11-03', 'Trance'),
      ('2', '2018-11-02', '2018-11-07', 'Alcoding'),
      ('3', '2018-11-01', '2018-11-04', 'DebSoc'),
      ('4', '2018-11-12', '2018-11-17', 'MunSoc'),
      ('5', '2018-11-03', '2018-11-06', 'Pulse');


      Query: Check for any availability between 2018-11-01 and 2018-11-03



      SELECT RoomId 
      FROM bookings
      GROUP BY RoomID
      HAVING
      SUM((From_D < '2018-11-01' AND To_D < '2018-11-01')
      OR
      (From_D > '2018-11-03' AND To_D > '2018-11-03')) = COUNT(*)


      Result: Only RoomId 4 is available as per the sample data



      | RoomId |
      | ------ |
      | 4 |






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Nov 22 at 20:21

























      answered Nov 15 at 12:19









      Madhur Bhaiya

      19.4k62236




      19.4k62236












      • I tried running this query but it returns zero rows for dates in which some rooms are free
        – Tanmay Shrivastava
        Nov 16 at 18:42










      • @TanmayShrivastava can you please provide the SQL for the sample data in the table, in which this query is failing
        – Madhur Bhaiya
        Nov 16 at 18:44










      • SELECT DISTINCT b1.RoomId FROM bookings AS b1 WHERE NOT EXISTS ( SELECT 1 FROM bookings AS b2 WHERE b2.RoomId = b1.RoomId AND NOT('2018-11-01'< b2.From_D AND '2018-11-03' < b2.From_D) OR NOT('2018-11-01' > b2.To_D AND '2018-11-03' > b2.To_D) )
        – Tanmay Shrivastava
        Nov 16 at 18:49












      • i know that there is a room that is free between the dates given but the query returns zero results
        – Tanmay Shrivastava
        Nov 16 at 18:51






      • 1




        Done ,I have set the data up
        – Tanmay Shrivastava
        Nov 16 at 19:35


















      • I tried running this query but it returns zero rows for dates in which some rooms are free
        – Tanmay Shrivastava
        Nov 16 at 18:42










      • @TanmayShrivastava can you please provide the SQL for the sample data in the table, in which this query is failing
        – Madhur Bhaiya
        Nov 16 at 18:44










      • SELECT DISTINCT b1.RoomId FROM bookings AS b1 WHERE NOT EXISTS ( SELECT 1 FROM bookings AS b2 WHERE b2.RoomId = b1.RoomId AND NOT('2018-11-01'< b2.From_D AND '2018-11-03' < b2.From_D) OR NOT('2018-11-01' > b2.To_D AND '2018-11-03' > b2.To_D) )
        – Tanmay Shrivastava
        Nov 16 at 18:49












      • i know that there is a room that is free between the dates given but the query returns zero results
        – Tanmay Shrivastava
        Nov 16 at 18:51






      • 1




        Done ,I have set the data up
        – Tanmay Shrivastava
        Nov 16 at 19:35
















      I tried running this query but it returns zero rows for dates in which some rooms are free
      – Tanmay Shrivastava
      Nov 16 at 18:42




      I tried running this query but it returns zero rows for dates in which some rooms are free
      – Tanmay Shrivastava
      Nov 16 at 18:42












      @TanmayShrivastava can you please provide the SQL for the sample data in the table, in which this query is failing
      – Madhur Bhaiya
      Nov 16 at 18:44




      @TanmayShrivastava can you please provide the SQL for the sample data in the table, in which this query is failing
      – Madhur Bhaiya
      Nov 16 at 18:44












      SELECT DISTINCT b1.RoomId FROM bookings AS b1 WHERE NOT EXISTS ( SELECT 1 FROM bookings AS b2 WHERE b2.RoomId = b1.RoomId AND NOT('2018-11-01'< b2.From_D AND '2018-11-03' < b2.From_D) OR NOT('2018-11-01' > b2.To_D AND '2018-11-03' > b2.To_D) )
      – Tanmay Shrivastava
      Nov 16 at 18:49






      SELECT DISTINCT b1.RoomId FROM bookings AS b1 WHERE NOT EXISTS ( SELECT 1 FROM bookings AS b2 WHERE b2.RoomId = b1.RoomId AND NOT('2018-11-01'< b2.From_D AND '2018-11-03' < b2.From_D) OR NOT('2018-11-01' > b2.To_D AND '2018-11-03' > b2.To_D) )
      – Tanmay Shrivastava
      Nov 16 at 18:49














      i know that there is a room that is free between the dates given but the query returns zero results
      – Tanmay Shrivastava
      Nov 16 at 18:51




      i know that there is a room that is free between the dates given but the query returns zero results
      – Tanmay Shrivastava
      Nov 16 at 18:51




      1




      1




      Done ,I have set the data up
      – Tanmay Shrivastava
      Nov 16 at 19:35




      Done ,I have set the data up
      – Tanmay Shrivastava
      Nov 16 at 19:35













      0














      Use BETWEEN and AND with your date



      SELECT DISTINCT RoomId FROM bookings    
      WHERE (date_field BETWEEN From_D AND To_d)





      share|improve this answer




























        0














        Use BETWEEN and AND with your date



        SELECT DISTINCT RoomId FROM bookings    
        WHERE (date_field BETWEEN From_D AND To_d)





        share|improve this answer


























          0












          0








          0






          Use BETWEEN and AND with your date



          SELECT DISTINCT RoomId FROM bookings    
          WHERE (date_field BETWEEN From_D AND To_d)





          share|improve this answer














          Use BETWEEN and AND with your date



          SELECT DISTINCT RoomId FROM bookings    
          WHERE (date_field BETWEEN From_D AND To_d)






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 15 at 6:54

























          answered Nov 15 at 6:49









          Sachin Shah

          1,160414




          1,160414























              0














              select distinct r.*
              from rooms r
              left join bookings b on b.RoomId=r.RoomId
              where b.RoomId is null or @arrival > To_D or @departure < from_td





              share|improve this answer

















              • 1




                answer with only code are poor, can you please explain what your code does?
                – DaFois
                Nov 15 at 16:53










              • What should @arrival do? That does not look like valid SQL
                – Nico Haase
                Nov 15 at 17:25
















              0














              select distinct r.*
              from rooms r
              left join bookings b on b.RoomId=r.RoomId
              where b.RoomId is null or @arrival > To_D or @departure < from_td





              share|improve this answer

















              • 1




                answer with only code are poor, can you please explain what your code does?
                – DaFois
                Nov 15 at 16:53










              • What should @arrival do? That does not look like valid SQL
                – Nico Haase
                Nov 15 at 17:25














              0












              0








              0






              select distinct r.*
              from rooms r
              left join bookings b on b.RoomId=r.RoomId
              where b.RoomId is null or @arrival > To_D or @departure < from_td





              share|improve this answer












              select distinct r.*
              from rooms r
              left join bookings b on b.RoomId=r.RoomId
              where b.RoomId is null or @arrival > To_D or @departure < from_td






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Nov 15 at 16:40









              Miguel Angel Alonso

              162




              162








              • 1




                answer with only code are poor, can you please explain what your code does?
                – DaFois
                Nov 15 at 16:53










              • What should @arrival do? That does not look like valid SQL
                – Nico Haase
                Nov 15 at 17:25














              • 1




                answer with only code are poor, can you please explain what your code does?
                – DaFois
                Nov 15 at 16:53










              • What should @arrival do? That does not look like valid SQL
                – Nico Haase
                Nov 15 at 17:25








              1




              1




              answer with only code are poor, can you please explain what your code does?
              – DaFois
              Nov 15 at 16:53




              answer with only code are poor, can you please explain what your code does?
              – DaFois
              Nov 15 at 16:53












              What should @arrival do? That does not look like valid SQL
              – Nico Haase
              Nov 15 at 17:25




              What should @arrival do? That does not look like valid SQL
              – Nico Haase
              Nov 15 at 17:25











              -1














              Try this :
              SELECT * FROM rooms room1
              WHERE NOT EXISTS (SELECT *
              FROM booking booking1
              WHERE room1.roomid = booking1.roomid AND
              (:from_d BETWEEN booking1.from_d AND booking1.to_d OR
              :to_d BETWEEN booking1.from_d AND booking1.to_d))





              share|improve this answer


























                -1














                Try this :
                SELECT * FROM rooms room1
                WHERE NOT EXISTS (SELECT *
                FROM booking booking1
                WHERE room1.roomid = booking1.roomid AND
                (:from_d BETWEEN booking1.from_d AND booking1.to_d OR
                :to_d BETWEEN booking1.from_d AND booking1.to_d))





                share|improve this answer
























                  -1












                  -1








                  -1






                  Try this :
                  SELECT * FROM rooms room1
                  WHERE NOT EXISTS (SELECT *
                  FROM booking booking1
                  WHERE room1.roomid = booking1.roomid AND
                  (:from_d BETWEEN booking1.from_d AND booking1.to_d OR
                  :to_d BETWEEN booking1.from_d AND booking1.to_d))





                  share|improve this answer












                  Try this :
                  SELECT * FROM rooms room1
                  WHERE NOT EXISTS (SELECT *
                  FROM booking booking1
                  WHERE room1.roomid = booking1.roomid AND
                  (:from_d BETWEEN booking1.from_d AND booking1.to_d OR
                  :to_d BETWEEN booking1.from_d AND booking1.to_d))






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 15 at 7:36









                  Atul Akabari

                  954




                  954






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53313840%2fmysql-query-to-find-rooms-available-given-dates-from-and-to%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

                      Calculate evaluation metrics using cross_val_predict sklearn

                      Insert data from modal to MySQL (multiple modal on website)