在 DATEDIFF 查询中减去一天
Minus a day in DATEDIFF query
如果用户选择 "2015-08-27 to 2015-08-29"
之间的日期,则 29 被视为他的结账日期,因此我想输出 27 和 28 的汇率。
现在下面这段代码输出3天,只需要输出2天
数据库
$pdo = $dbo->prepare(
"SELECT r.*, rr.rid, SUM(ABS(DATEDIFF(:ci, :co) * rr.rate)) as totalsum, rr.sdate, rr.edate
FROM rooms r
LEFT JOIN rates as rr ON r.id=rr.rid
WHERE r.id NOT IN (SELECT room_id FROM reservation as b WHERE (b.checkout <= :ci
AND b.checkin >= :co) OR (b.checkout >= :ci AND b.checkin <= :co))
AND (rr.sdate >= :ci AND rr.edate <=:co) OR (rr.sdate <=:ci AND rr.edate >=:co)
GROUP BY rr.rid, r.room_name");
//$pdo->bindValue(':stat', 'confirm', PDO::PARAM_STR);
$pdo->bindParam(':ci', $check_in, PDO::PARAM_STR);
$pdo->bindParam(':co', $check_out, PDO::PARAM_STR);
if (!$pdo->execute()) {
print_r($pdo->errorInfo());
} else {
//Do something
}
我只是从这个
改变了我的 check out string
$check_out = date("Y-m-d" strtotime($_POST['co'])
到
$check_out = date("Y-m-d", strtotime('-1 day', strtotime($_POST['co'])));
并像下面这样删除查询中的 DATEDIFF() & ABS()
SELECT r.*, rr.rid, SUM(rr.rate) as totalsum, rr.sdate, rr.edate
FROM rooms r
LEFT JOIN rates as rr ON r.id=rr.rid
WHERE rr.sdate >= :ci AND rr.edate <= :co
GROUP BY rr.rid, r.room_name
完成。
您甚至可能不需要在 PHP 中解决它,在您的查询中使用类似:
DATE_SUB(final_date, INTERVAL 1 DAY)
这应该相当于 (final_date - 1 天)
在 MySql 中,您可以简单地使用 DATE_ADD(checkout_date,INTERVAL -1 DAY)。它会从您的结帐日期开始减少 1 天
然后你可以正确计算日期差异
DATEDIFF(DATE_ADD(checkout_date,INTERVAL -1 DAY),checkin_Date)
如果用户选择 "2015-08-27 to 2015-08-29"
之间的日期,则 29 被视为他的结账日期,因此我想输出 27 和 28 的汇率。
现在下面这段代码输出3天,只需要输出2天
数据库
$pdo = $dbo->prepare(
"SELECT r.*, rr.rid, SUM(ABS(DATEDIFF(:ci, :co) * rr.rate)) as totalsum, rr.sdate, rr.edate
FROM rooms r
LEFT JOIN rates as rr ON r.id=rr.rid
WHERE r.id NOT IN (SELECT room_id FROM reservation as b WHERE (b.checkout <= :ci
AND b.checkin >= :co) OR (b.checkout >= :ci AND b.checkin <= :co))
AND (rr.sdate >= :ci AND rr.edate <=:co) OR (rr.sdate <=:ci AND rr.edate >=:co)
GROUP BY rr.rid, r.room_name");
//$pdo->bindValue(':stat', 'confirm', PDO::PARAM_STR);
$pdo->bindParam(':ci', $check_in, PDO::PARAM_STR);
$pdo->bindParam(':co', $check_out, PDO::PARAM_STR);
if (!$pdo->execute()) {
print_r($pdo->errorInfo());
} else {
//Do something
}
我只是从这个
改变了我的check out string
$check_out = date("Y-m-d" strtotime($_POST['co'])
到
$check_out = date("Y-m-d", strtotime('-1 day', strtotime($_POST['co'])));
并像下面这样删除查询中的 DATEDIFF() & ABS()
SELECT r.*, rr.rid, SUM(rr.rate) as totalsum, rr.sdate, rr.edate
FROM rooms r
LEFT JOIN rates as rr ON r.id=rr.rid
WHERE rr.sdate >= :ci AND rr.edate <= :co
GROUP BY rr.rid, r.room_name
完成。
您甚至可能不需要在 PHP 中解决它,在您的查询中使用类似:
DATE_SUB(final_date, INTERVAL 1 DAY)
这应该相当于 (final_date - 1 天)
在 MySql 中,您可以简单地使用 DATE_ADD(checkout_date,INTERVAL -1 DAY)。它会从您的结帐日期开始减少 1 天 然后你可以正确计算日期差异
DATEDIFF(DATE_ADD(checkout_date,INTERVAL -1 DAY),checkin_Date)