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 '18 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 '18 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 '18 at 11:56









Madhur Bhaiya

19.6k62236




19.6k62236










asked Nov 15 '18 at 6:46









Tanmay ShrivastavaTanmay Shrivastava

84




84












  • please provide sample data and your expected output in table format

    – fa06
    Nov 15 '18 at 6:49

















  • please provide sample data and your expected output in table format

    – fa06
    Nov 15 '18 at 6:49
















please provide sample data and your expected output in table format

– fa06
Nov 15 '18 at 6:49





please provide sample data and your expected output in table format

– fa06
Nov 15 '18 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 '18 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 '18 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 '18 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 '18 at 18:51






  • 1





    Done ,I have set the data up

    – Tanmay Shrivastava
    Nov 16 '18 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 '18 at 16:53











    • What should @arrival do? That does not look like valid SQL

      – Nico Haase
      Nov 15 '18 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 '18 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 '18 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 '18 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 '18 at 18:51






      • 1





        Done ,I have set the data up

        – Tanmay Shrivastava
        Nov 16 '18 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 '18 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 '18 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 '18 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 '18 at 18:51






      • 1





        Done ,I have set the data up

        – Tanmay Shrivastava
        Nov 16 '18 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 '18 at 20:21

























      answered Nov 15 '18 at 12:19









      Madhur BhaiyaMadhur Bhaiya

      19.6k62236




      19.6k62236












      • I tried running this query but it returns zero rows for dates in which some rooms are free

        – Tanmay Shrivastava
        Nov 16 '18 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 '18 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 '18 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 '18 at 18:51






      • 1





        Done ,I have set the data up

        – Tanmay Shrivastava
        Nov 16 '18 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 '18 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 '18 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 '18 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 '18 at 18:51






      • 1





        Done ,I have set the data up

        – Tanmay Shrivastava
        Nov 16 '18 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 '18 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 '18 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 '18 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 '18 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 '18 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 '18 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 '18 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 '18 at 18:51




      1




      1





      Done ,I have set the data up

      – Tanmay Shrivastava
      Nov 16 '18 at 19:35





      Done ,I have set the data up

      – Tanmay Shrivastava
      Nov 16 '18 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 '18 at 6:54

























          answered Nov 15 '18 at 6:49









          Sachin ShahSachin Shah

          1,7561516




          1,7561516





















              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 '18 at 16:53











              • What should @arrival do? That does not look like valid SQL

                – Nico Haase
                Nov 15 '18 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 '18 at 16:53











              • What should @arrival do? That does not look like valid SQL

                – Nico Haase
                Nov 15 '18 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 '18 at 16:40









              Miguel Angel AlonsoMiguel Angel Alonso

              364




              364







              • 1





                answer with only code are poor, can you please explain what your code does?

                – DaFois
                Nov 15 '18 at 16:53











              • What should @arrival do? That does not look like valid SQL

                – Nico Haase
                Nov 15 '18 at 17:25












              • 1





                answer with only code are poor, can you please explain what your code does?

                – DaFois
                Nov 15 '18 at 16:53











              • What should @arrival do? That does not look like valid SQL

                – Nico Haase
                Nov 15 '18 at 17:25







              1




              1





              answer with only code are poor, can you please explain what your code does?

              – DaFois
              Nov 15 '18 at 16:53





              answer with only code are poor, can you please explain what your code does?

              – DaFois
              Nov 15 '18 at 16:53













              What should @arrival do? That does not look like valid SQL

              – Nico Haase
              Nov 15 '18 at 17:25





              What should @arrival do? That does not look like valid SQL

              – Nico Haase
              Nov 15 '18 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 '18 at 7:36









                  Atul AkabariAtul 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.




                      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







                      這個網誌中的熱門文章

                      Barbados

                      How to read a connectionString WITH PROVIDER in .NET Core?

                      Node.js Script on GitHub Pages or Amazon S3