MySQL:想知道如何在调整时区后根据日期选择记录


MySQL: Wondering how to select records based on day, after adjusting for timezone

我想根据表中的具体情况选择"当前可用"的记录。我认为这应该很容易,但当然,我没有看到。我希望在这里提问能让我足够兴奋,也许我可以回答我自己的问题!

我有两张桌子:

table_1  
    id  
    time_zone_name (eg, "US/Eastern")
table_2  
    tab1_id  
    day_of_week (1=Monday, 7=Saturday)

假设我知道当前的GMT时间戳是"2012-07-08 13:35:00 GMT",那么在调整时区后,我应该能够从表_1中选择记录,其中表_2.day_of_week是匹配的

MySql函数CONVERT_TZ看起来很有希望!

CONVERT_TZ('2004-01-01 12:00:00','GMT','MET')
CONVERT_TZ('2004-01-01 12:00:00','+00:0','+10:00');

我本可以试试这个:

从table_1内部联接table_2 ON选择id(table_1.id=table_2.table_1_id)
WHERE DAYOFWEEK(CONVERT_TZ(UTC_TIMESTAMP,'GMT',table_1.time_zone_name))=table_2.day_of_week

但是CONVERT_TZ函数不接受在我的主机上安装的MySql上的类似"美国/东方"的区域名称。根据MySql文档:

要使用命名时区,如"MET"或"欧洲/莫斯科",必须正确设置时区表。

显然,它们设置不正确。

有更好的方法吗?如有任何建议,我们将不胜感激。

如果您使用查找表来获取差异,我相信您是在询问网站用户他们在哪里。一旦他们进入他们的位置,你可以很容易地使用一些PHP来通过你的脚本设置他们的本地化。php本地化非常简单。时区列表确实很大。虽然它确实包含你的美国/东方的例子,但不建议你实现t,因为它只是为了向后兼容性而维护的(在"其他"下)。

然后,您可以使用这个date('Z')使用php日期来获得以秒为单位的偏移量。如果您将日期时间字段存储为unix时间戳,那么添加或减去它们的偏移量将是一件小事。通过这种方式,您可以对存储的数据进行标准化,并将其保持在零偏移(GMT)。

当您查询数据库中的数据时,只需将在上面步骤中获得的偏移量添加到结果输出中即可。您甚至可以再次使用date()将日期/时间格式化为其本地格式类型。