我需要每天向所有必须在给定时间范围内检查血压的用户发送提醒短信。我的时间表中的记录是:
user_id |name |checkup_time |timezone
1 | user1 | 01:30:00 | PST
2 | user2 | 03:00:00 | CST
目前,我可以获得检查时间介于current_time和(当前时间+30分钟)之间的用户列表。
我使用了以下mysql查询来实现这一点:
$checkup_time_min = date('H:i:s');
$checkup_time_max = date("H:i:s", strtotime($currTime ."+30 minutes"));
SELECT ... WHERE checkup_time BETWEEN '".$checkup_time_min."' AND '".$checkup_time_max."'
但是,我希望在这种情况下考虑时区。
如果有任何帮助或暗示,我将不胜感激。
提前感谢
您可能希望将时间存储为数据库中的UTC,这将使这样的查询更加合乎逻辑且易于理解。当你从数据库中提取时间时,你也可以提取timeozne,并在那时进行任何必要的转换。
事实上,您可以查询之间的所有值
$checkup_time_min +- (time conversion for given timezone)
和
$checkup_time_max -+ (time conversion for given timezone)
但是您需要为每个时区运行不同的查询。或者,你可以做一堆if语句来检查时区,但这并不干净。
感谢您的指导。我发现CONVERT_TZ正是我所需要的。
考虑到Matt Johnson的建议,我将列时区中的数据更改如下:(从CST更改为-05:00)
user_id |name |checkup_time |timezone
1 | user1 | 01:30:00 | -08:00
2 | user2 | 03:00:00 | -05:00
代码被更改为
$checkup_time_min = date('Y-m-d H:i:s');
$checkup_time_max = date("Y-m-d H:i:s", strtotime($currTime ."+30 minutes"));
SELECT ... WHERE checkup_time BETWEEN CONVERT_TZ ('".$checkup_time_min ."','-05:00',timezone) AND CONVERT_TZ ('".$checkup_time_max ."','-05:00',timezone)
注意:服务器的时区是CST,因此转换为"-05:00"