如何在两个日期之间选择一条记录

时间:2014-03-07 18:56:07

标签: php mysql

我有一张桌子,用于存储房间的预订,以及我想要的每个房间,按PHP日期选择预订。这是查询:

SELECT id_prenotazione, id_alloggio, FROM_UNIXTIME(data_checkin,'%d/%m/%Y') AS checkin,
  FROM_UNIXTIME(data_checkout,'%d/%m/%Y') AS checkout, pagata, esclusiva
FROM prenotazioni 
WHERE id_alloggio = $id_alloggio
  AND FROM_UNIXTIME(data_checkin,'%d/%m/%Y') >= ".$data."
  OR FROM_UNIXTIME(data_checkout,'%d/%m/%Y') <= " .$data.") 
ORDER BY checkin ASC
LIMIT 1;

但如果同一房间有两个或两个以上的预订,则查询始终返回第一个预约,而如果我将“ASC”更改为“DESC”,则仅返回最后一个预约。我希望在特定日期($ data)中预订特定房间($ id_allogio)。我究竟做错了什么?提前感谢您的回答。

3 个答案:

答案 0 :(得分:0)

为什么不使用between语句:

SELECT col1,col2,col3,col4,blabla 
FROM prenotazioni 
WHERE 
id_alloggio = $id_alloggio 
and FROM_UNIXTIME(data_checkin,'%d/%m/%Y') between date_1 AND date_2
ORDER BY checkin ASC
LIMIT 1;

答案 1 :(得分:0)

您的问题很难确切地告诉您需要什么。您似乎需要在特定日期看到与特定房间匹配的单个预订。

但是如果一天有多个房间预订,你就不会告诉我们会发生什么。也就是说,如果存在超量预订,您不会告诉我们应该发生什么。

无论如何,处理TIMESTAMP(即UNIXTIME)数据项的方案不是很好。

我建议你修改你的查询如下:

SELECT id_prenotazione,
       id_alloggio,
       FROM_UNIXTIME(data_checkin,'%d/%m/%Y') AS checkin,    
       FROM_UNIXTIME(data_checkout,'%d/%m/%Y') AS checkout, 
       pagata, 
       esclusiva
  FROM prenotazioni 
 WHERE id_alloggio = $id_alloggio 
   AND STR_TO_DATE($data, '%d/%m/%Y') >= data_checkin
   AND STR_TO_DATE($data, '%d/%m/%Y') <  data_checkout + INTERVAL 1 DAY
 ORDER BY checkin ASC

我在这里做了什么改变?

首先,我将您的演示风格日期(代表2013年12月17日为2013年12月17日)转换为内部MySQL本机日期格式,之前使用它来进行比较,使用不等式{ {1}}和>=。有必要这样做。当您比较<17/12/2013等字符串时,您会得到错误的排序。

此外,我编写查询的方式允许MySQL使用索引来满足它。

其次,我将结帐比较更改为

18/11/2013

这是因为您似乎正在使用包含日历日期和时间的 parameter-date < data_checkout + INTERVAL 1 DAY data_checkin数据类型。我使用的比较允许在data_checkout显示午夜以外的结帐时间时结果正确。

最后,我摆脱了LIMIT 1.在我看来,你需要知道特定日期的房间是否有多个预订。

答案 2 :(得分:0)

我用这种方式解决了问题:

  1. 我将PHP TIMESTAMP的签到和退房日期格式更改为MYSQL DATE
  2. 我重写了你给我的信息的查询:

    SELECT id_prenotazione,id_alloggio,data_checkin,data_checkout,pagata,esclusiva 来自prenotazioni WHERE id_alloggio = $ id_alloggio AND'$ data'&gt; = data_checkin AND'$ data'&lt; data_checkout + INTERVAL 1 DAY

  3. 通过这些更正,查询重新计算特定日期内特定房间的单一预订。 谢谢您的有用答案!