2015-04-06 84 views
1

我需要每天向所有必须在给定时间范围内检查血压的用户发送提醒短信。 记录在我的日程安排表:检查时间(带时区)是否在给定时间范围内

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."' 

不过,我想TIME_ZONE在这种情况下可以考虑。

我真的很感激任何帮助或提示。

在此先感谢

+0

为什么不将所有时间都存储在数据库中作为UTC?如果您稍后需要本地时区显示给用户,则可以在检索时间和联系信息时进行转换 – leigero

+1

时区缩写不足。请阅读[时区标记wiki](http://stackoverflow.com/tags/timezone/info)。 –

回答

0

感谢您给的指示。我发现CONVERT_TZ是我需要的。

以建议从马特·约翰逊考虑,我已经改变了在列时区中的数据如下:(从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'

1

你可能会想在倍UTC存储在数据库中,这将使这样更符合逻辑和易于理解的查询。当你从数据库中拉出时间时,你也可以拉动时间轴并在那个时候进行必要的转换。

正因为如此,你可以查询所有值

之间

$checkup_time_min +- (time conversion for given timezone)

$checkup_time_max -+ (time conversion for given timezone)

但你需要运行的每个时区不同的查询。或者,你可以做一堆if语句来检查时区,但这并不是很干净。

+0

欣赏你的建议。我同意将时间存储为UTC会更容易,但它也要求在当前工作流程中进行更改,其中checkup_time需要位于用户的时区 –

相关问题