{"id":252,"date":"2014-03-29T17:36:59","date_gmt":"2014-03-29T17:36:59","guid":{"rendered":"https:\/\/blogs.ua.es\/jpm33\/?p=252"},"modified":"2014-03-29T17:36:59","modified_gmt":"2014-03-29T17:36:59","slug":"sql-para-sistema-de-reservas","status":"publish","type":"post","link":"https:\/\/blogs.ua.es\/jpm33\/2014\/03\/29\/sql-para-sistema-de-reservas\/","title":{"rendered":"SQL para sistema de reservas"},"content":{"rendered":"<h1>Introducci\u00f3n<\/h1>\n<p>En un proyecto reciente he tenido que preparar un sistema de reservas para un hotel. La idea es sencilla poder reservar recursos (en este caso habitaciones) entre unas fechas determinadas.<\/p>\n<p>Pero adem\u00e1s, como es un hotel se da una condici\u00f3n especial. La fecha de inicio y de fin no son cerradas, quiero decir que una reserva puede terminar el mismo d\u00eda que otra empieza y viceversa. Por todos es sabido, que normalmente en un hotel la hora de salida es hasta las 12:00am y la hora de entrada es a partir de las 14:00pm.<\/p>\n<p>\u00bfC\u00f3mo resolverlo? Sencillo,veamoslo.<\/p>\n<h1>Soluci\u00f3n<\/h1>\n<p>Primero suponemos un esquema tan sencillo como el siguiente:<\/p>\n<pre>CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;\n\nCREATE TABLE IF NOT EXISTS `mydb`.`habitaciones` (\n  `numero` INT(11) NOT NULL,\n  `nombre` VARCHAR(45) NULL DEFAULT NULL,\n  `camas` INT(11) NULL DEFAULT NULL,\n  `camagrande` TINYINT(1) NULL DEFAULT NULL,\n  `disponible` TINYINT(1) NULL DEFAULT NULL,\n  PRIMARY KEY (`numero`))\nENGINE = InnoDB\nDEFAULT CHARACTER SET = utf8\nCOLLATE = utf8_general_ci;\n\nCREATE TABLE IF NOT EXISTS `mydb`.`reservas` (\n  `reserva_id` INT(11) NOT NULL AUTO_INCREMENT,\n  `habitaciones_numero` INT(11) NOT NULL,\n  `entrada` DATE NULL DEFAULT NULL,\n  `salida` DATE NULL DEFAULT NULL,\n  `nombrecliente` VARCHAR(45) NULL DEFAULT NULL,\n  `telefono` VARCHAR(45) NULL DEFAULT NULL,\n  PRIMARY KEY (`reserva_id`),\n  INDEX `fk_reservas_habitaciones_idx` (`habitaciones_numero` ASC),\n  CONSTRAINT `fk_reservas_habitaciones`\n    FOREIGN KEY (`habitaciones_numero`)\n    REFERENCES `mydb`.`habitaciones` (`numero`)\n    ON DELETE NO ACTION\n    ON UPDATE NO ACTION)\nENGINE = InnoDB\nDEFAULT CHARACTER SET = utf8\nCOLLATE = utf8_general_ci;<\/pre>\n<p>El siguiente paso paso ser\u00eda crear alg\u00fan dato. Una vez hecho esto, podemos considerar muchos casos posbles, buscando en Internet seguro que hay muchas aproximaciones pero la soluci\u00f3n final que yo he encontrado y funciona perfectamente para mi caso es la siguiente:<\/p>\n<pre>set @dstart = date_add('2014-03-15', interval 1 day);\nset @dend   = date_sub('2014-04-01', interval 1 day);\nselect id, vivienda_id, arrival_date, departure_date, date_add(@dstart, interval 1 day) firstday, date_sub(@dend, interval 1 day) lastday\nfrom espana_reservations r\nwhere (arrival_date between @dstart and @dend)\n   or (@dstart between arrival_date and departure_date)<\/pre>\n<p>Espero que haya sido de ayuda!<\/p>\n<h1>Referencias<\/h1>\n<ul>\n<li><b>Manual de MySQL<\/b>: <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/es\/date-and-time-functions.html\">12.5. Funciones de fecha y hora<\/a><\/li>\n<li><b>Manual de MySQL<\/b>: <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/es\/date-calculations.html\">3.3.4.5. C\u00e1lculos sobre fechas<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n En un proyecto reciente he tenido que preparar un sistema de reservas para un hotel. La idea es sencilla poder reservar recursos (en este caso habitaciones) entre unas fechas determinadas. Pero adem\u00e1s, como es un hotel se da una &hellip; <a href=\"https:\/\/blogs.ua.es\/jpm33\/2014\/03\/29\/sql-para-sistema-de-reservas\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":3080,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[374,236732,236731],"tags":[154,236718,1839,23],"class_list":["post-252","post","type-post","status-publish","format-standard","hentry","category-programacion","category-sql","category-web","tag-ingenieria","tag-programacion-2","tag-sql","tag-web"],"_links":{"self":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/users\/3080"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/comments?post=252"}],"version-history":[{"count":3,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/252\/revisions"}],"predecessor-version":[{"id":255,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/252\/revisions\/255"}],"wp:attachment":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/media?parent=252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/categories?post=252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/tags?post=252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}