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

Posted

技术标签:

【中文标题】如何在两个日期之间的时间选择一条记录【英文标题】:How to select one record at time between two dates 【发布时间】:2014-04-11 02:13:00 【问题描述】:

我有一个存储房间预订的表格,我希望为每个房间选择预订,按 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)。我究竟做错了什么?提前感谢您的回答。

【问题讨论】:

很难理解你的语言:) 通过向FROM_UNIXTIME() 提供格式参数,您将获得一个字符串结果,您的比较操作将按照字典顺序执行。 $data是什么格式? 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集 您想要入住日期在 $data 之前,而退房日期在 $data 之后的预订吗?因为那里有一个 OR 子句,而不是 AND。对你真正想要得到的东西感到困惑 首先,对不起我的英语。 $data 来自: $date = strtotime($current_year."-".$current_month."-".$current_day); $date = date("d/m/Y",$date); FROM_UNIXTIME 返回一个字符串?我不知道这个。 【参考方案1】:

为什么不使用 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;

【讨论】:

我尝试使用 BETWEEN 语句,但我没有两个不同的日期(date_1 和 date_2);我有一个日期($data)应该介于签入和结帐之间。【参考方案2】:

您的问题使您很难准确说出您需要什么。您似乎需要查看在特定日期与特定房间匹配的单一预订。

但您没有告诉我们如果一天有多个房间预订会发生什么。也就是说,如果出现超额预订,您不会告诉我们会发生什么。

无论如何,您处理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 月 12 日)转换为内部 mysql 原生日期格式,之前使用它使用不等式进行比较,例如 @ 987654323@ 和&lt;。有必要这样做。当您比较 17/12/201318/11/2013 之类的字符串时,您会得到不正确的排序。

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

其次,我把你的结帐比较改为

   parameter-date < data_checkout + INTERVAL 1 DAY

那是因为您似乎在使用包含日历日期和时间的 data_checkindata_checkout 数据类型。当data_checkout 显示的结帐时间不是午夜时,我使用的比较结果是正确的。

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

【讨论】:

感谢您的全面回复。我需要在同一时间为每个房间出示一份预订,并在办理入住和退房手续时处理此案。 data_checkin 和 data_checkout 存储在 PHP TIMESTAMP 中,而 $data 是 PHP 日期格式。 有趣。所以我可以预订 3 月 8 日星期六的入住和退房时间吗?那有意义吗?还是我会在 3 月 8 日入住并在 3 月 9 日退房?不了解业务规则,很难给出精确的查询代码。 例如:一个预订的入住日期为 3 月 8 日,退房日期为 3 月 9 日。同一房间的另一个预订的入住日期为 3 月 9 日,退房日期为 3 月 12 日。 那么,如果我查询 3 月 9 日,我应该查看哪个预订?我猜是第二个。因此,请从我的回答中的查询中删除 + INTERVAL 1 DAY 我尝试执行查询并得到两个预订:第一个预订日期为 3 月 9 日,第二个预订日期为 3 月 9 日。因此,如果我删除code+ INTERVAL 1 DAY,则查询不会选择结帐日期。【参考方案3】:

我是这样解决问题的:

    我将入住和退房日期的格式从 PHP TIMESTAMP 更改为 MYSQL DATE

    我根据你给我的信息重写了查询:

    选择 id_prenotazione、id_alloggio、data_checkin、data_checkout、pagata、esclusiva FROM prenotazioni WHERE id_alloggio = $id_alloggio AND '$data' >= data_checkin AND '$data'

通过这些更正,查询将在特定日期重新预订特定房间的单次预订。 感谢您的有用回答!

【讨论】:

以上是关于如何在两个日期之间的时间选择一条记录的主要内容,如果未能解决你的问题,请参考以下文章

按日期选择不同的前一条记录

如何返回最早日期的记录?

如何在 vb.net 中获取两个日期之间的记录?

使用java在sqlite中选择两个日期之间的行

如果它在两个不同的日期之间,如何选择今天的日期[重复]

如何在mysql选择查询中获取两个日期之间的日期列表[重复]