如何检查特定时间是否介于日期之间?
How to check if a specific time is between to dates?
我想创建一个函数来检查特定时间是否介于存储在 MySQL 数据库中的两个时间戳之间。
该函数应该能够忽略时间($fullday = true
)或检查时间。
我的存在 table 与 start = 2021-11-01 10:00:00
和 end = 2021-11-05 18:00:00
有一行。
is_available('2021-11-02', true);
应该给我一个结果,但没有。
我也期待:
is_available('2021-11-01 09:30:00');
不应该有结果,因为 9:30 在 10:00 之前但是 is_available('2021-11-01 10:01:00');
应该给我一个结果。等等。
我的函数创建的查询是:
SELECT *
FROM `presence`
WHERE DATE_FORMAT(start, "%Y-%m-%d") <= "2021-11-02"
AND DATE_FORMAT(end, "%Y-%m-%d") >= "2021-11-02"
这是我目前的功能:
function is_available($date, $fullday = false)
{
$presenceModel = new PresenceModel();
if ($fullday) {
$date = date('Y-m-d', strtotime($date));
$presences = $presenceModel
->where('DATE_FORMAT(start, "%Y-%m-%d") <= "' . $date . '"')
->where('DATE_FORMAT(end, "%Y-%m-%d") >= "' . $date . '"')
->findAll();
} else {
$date = date('Y-m-d H:i:s', strtotime($date));
$presences = $presenceModel
->where('DATE_FORMAT(start, "%Y-%m-%d %H:%i:%s") <= "' . $date . '"')
->where('DATE_FORMAT(end, "%Y-%m-%d %H:%i:%s") >= "' . $date . '"')
->findAll();
}
return count($presences) > 0 ? true : false;
}
我的方法是使用 strtotime()
函数将日期转换为 int,然后将另一个日期从 db 然后比较 php.
中的那些 ints
if($datenow > $dbstartdate && $datenow < $dbenddate){
return true;
}else{
return false;
}
您应该能够通过让 MySQl 完成更多工作来显着简化此过程。您无需格式化 DATETIME 列即可对它们进行比较,BETWEEN 将进一步减少您的 PHP 工作量。
根据您上面的代码,我认为这可以完成工作:
function is_available($date, $fullDay = false) {
$presenceModel = new PresenceModel();
$date = date('Y-m-d H:i:s', strtotime($date));
if ($fullDay) {
$presences = $presenceModel
->where("'$date' between DATE(`start`) and DATE(`end`)" )
->findAll();
} else {
$presences = $presenceModel
->where("'$date' between `start` and `end`" )
->findAll();
}
return count($presences) > 0 ? true : false;
}
但是,使用 SELECT *
将 return 所有匹配行的全部,而您真正需要的只是是否存在一个。你的目标应该是让你的查询接近这个,如果有匹配的行,这将 return 只是一个值 (1
)。:
SELECT 1 FROM `presence`
WHERE "2021-11-02" between start AND end
LIMIT 1
我想创建一个函数来检查特定时间是否介于存储在 MySQL 数据库中的两个时间戳之间。
该函数应该能够忽略时间($fullday = true
)或检查时间。
我的存在 table 与 start = 2021-11-01 10:00:00
和 end = 2021-11-05 18:00:00
有一行。
is_available('2021-11-02', true);
应该给我一个结果,但没有。
我也期待:
is_available('2021-11-01 09:30:00');
不应该有结果,因为 9:30 在 10:00 之前但是 is_available('2021-11-01 10:01:00');
应该给我一个结果。等等。
我的函数创建的查询是:
SELECT *
FROM `presence`
WHERE DATE_FORMAT(start, "%Y-%m-%d") <= "2021-11-02"
AND DATE_FORMAT(end, "%Y-%m-%d") >= "2021-11-02"
这是我目前的功能:
function is_available($date, $fullday = false)
{
$presenceModel = new PresenceModel();
if ($fullday) {
$date = date('Y-m-d', strtotime($date));
$presences = $presenceModel
->where('DATE_FORMAT(start, "%Y-%m-%d") <= "' . $date . '"')
->where('DATE_FORMAT(end, "%Y-%m-%d") >= "' . $date . '"')
->findAll();
} else {
$date = date('Y-m-d H:i:s', strtotime($date));
$presences = $presenceModel
->where('DATE_FORMAT(start, "%Y-%m-%d %H:%i:%s") <= "' . $date . '"')
->where('DATE_FORMAT(end, "%Y-%m-%d %H:%i:%s") >= "' . $date . '"')
->findAll();
}
return count($presences) > 0 ? true : false;
}
我的方法是使用 strtotime()
函数将日期转换为 int,然后将另一个日期从 db 然后比较 php.
if($datenow > $dbstartdate && $datenow < $dbenddate){
return true;
}else{
return false;
}
您应该能够通过让 MySQl 完成更多工作来显着简化此过程。您无需格式化 DATETIME 列即可对它们进行比较,BETWEEN 将进一步减少您的 PHP 工作量。
根据您上面的代码,我认为这可以完成工作:
function is_available($date, $fullDay = false) {
$presenceModel = new PresenceModel();
$date = date('Y-m-d H:i:s', strtotime($date));
if ($fullDay) {
$presences = $presenceModel
->where("'$date' between DATE(`start`) and DATE(`end`)" )
->findAll();
} else {
$presences = $presenceModel
->where("'$date' between `start` and `end`" )
->findAll();
}
return count($presences) > 0 ? true : false;
}
但是,使用 SELECT *
将 return 所有匹配行的全部,而您真正需要的只是是否存在一个。你的目标应该是让你的查询接近这个,如果有匹配的行,这将 return 只是一个值 (1
)。:
SELECT 1 FROM `presence`
WHERE "2021-11-02" between start AND end
LIMIT 1