我想创建一个php代码,根据用户指定的开始日期和结束时间检查时间是否已过期或仍然有效。 下面是我试过的数据库结构和示例php代码。
game_config
game_id | start_date | start_t | start_h | end_time | end_h | status
--------|------------|---------|---------|----------|-------|---------
100 | 03/26/2018 | 10:45 | PM | 12:30 | AM | 0
101 | 03/27/2018 | 09:23 | AM | 11:10 | AM | 0
Php代码示例
<?php
$conf_execution_date = date('m/d/Y'); /*Current date*/
$conf_execution_meridiem = date('A'); /*Current meridiem*/
$conf_execution_timer = date('h:m'); /*Current time*/
$conf_execution_proccess = false; /*Proceed or not*/
$conf_handler = $appconn->prepare("
SELECT * FROM game_config WHERE game_id = :game_id AND start_date = :start_dateAND start_t = :start_t AND status = 0 LIMIT 1
");
$conf_handler->bindParam(":game_id", 100);
$conf_handler->bindParam(":start_date", $conf_execution_date);
$conf_handler->bindParam(":start_t", $conf_execution_meridiem);
$conf_handler->execute();
$appconf = $conf_handler->fetch(PDO::FETCH_OBJ);
if($appconf){
$config_start_time = strtotime($appconf->start_t);
$config_end_time = strtotime($appconf->end_time);
$current_time = strtotime($conf_execution_timer);
if($appconf->start_h == $conf_execution_meridiem){ /*AM-PM*/
if($config_start_time >= $current_time){ /*Check if the start time is now o still active*/
$conf_execution_proccess = true;
}
}
if($appconf->end_h == $conf_execution_meridiem){ /*AM-PM*/
if($config_end_time >= $current_time){ /*Check if the time has ended*/
$conf_execution_proccess = false;
}
}
if($conf_execution_proccess == true){
echo 'YES THE GAME IS STILL ACTIVE';
}else{
echo "NO GAME HAS ENDED";
}
}
?>
答案 0 :(得分:0)
假设您的start_date
列的类型为VARCHAR()
:
假设您的end_time
总是晚于start_time
:
您可以使用此类查询来获取表格每行的起始和结束DATETIME
值。它将日期,时间和AM / PM字段粘合在一起,并将它们转换为DATETIME
。 (http://sqlfiddle.com/#!9/2d84ea/1/0)
SELECT game_id,
STR_TO_DATE(CONCAT(start_date,'-',start_t,start_h), '%m/%d/%Y-%h:%i%p') start_ts,
STR_TO_DATE(CONCAT(start_date,'-',end_time,end_h), '%m/%d/%Y-%h:%i%p') end_ts,
status
FROM game_config
然后,您可以将这些start_ts
和end_ts
值与NOW()
进行比较,方法是将此行添加到您的查询中
然后,您可以使用所需的条件填写查询,并提供此查询。
SELECT game_id,
STR_TO_DATE(CONCAT(start_date,'-',start_t,start_h), '%m/%d/%Y-%h:%i%p') start_ts,
STR_TO_DATE(CONCAT(start_date,'-',end_time,end_h), '%m/%d/%Y-%h:%i%p') end_ts,
status
FROM game_config
WHERE game_id = : gameid AND status = 0
HAVING start_ts <= NOW() and NOW() < end_ts
LIMIT 1
但是,你的开始和结束时间有时会跨越午夜,这意味着你的end_ts需要在第二天。这使得你的日期检查逻辑相当棘手。您必须执行某种条件表达式,如果+ INTERVAL 1 DAY
位于end_ts
之前,则start_ts
game_id int
start_ts timestamp of start
end_ts timestamp of end
status int
。
如果你在表格中添加以下列,你会好起来的(@eggyal在他的评论中指出了这一点)。
handleUniversalLink
然后,您不必担心从三个不同列中制作正确时间戳的所有内容,并且当开始和结束时间跨越午夜时,您不必做任何特别的事情。
而且,无论您的用户处于什么时区,这都将直观地发挥作用。