如何检查特定时间是否介于日期之间?

How to check if a specific time is between to dates?

我想创建一个函数来检查特定时间是否介于存储在 MySQL 数据库中的两个时间戳之间。

该函数应该能够忽略时间($fullday = true)或检查时间。

我的存在 table 与 start = 2021-11-01 10:00:00end = 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