如何在两个日期之间的时间选择一条记录
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@ 和<
。有必要这样做。当您比较 17/12/2013
和 18/11/2013
之类的字符串时,您会得到不正确的排序。
此外,我编写查询的方式允许 MySQL 使用索引来满足它。
其次,我把你的结帐比较改为
parameter-date < data_checkout + INTERVAL 1 DAY
那是因为您似乎在使用包含日历日期和时间的 data_checkin
和 data_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'
通过这些更正,查询将在特定日期重新预订特定房间的单次预订。 感谢您的有用回答!
【讨论】:
以上是关于如何在两个日期之间的时间选择一条记录的主要内容,如果未能解决你的问题,请参考以下文章