我有一个包含以下列的表:
|start_date |TZ |
|Dec 2, 2012 |Eastern |
|Dec 2, 2012 |GMT |
注1:我们的服务器是UTC时间。
注2:列start_date是日期字段,而不是时间戳字段。 2012年12月2日隐含地表示“2012-12-02 00:00:00”
注3:上表实际上是多个规范化表,但为了简单起见,我对其进行了规范化。
注4:我可以将任何内容放入TZ表中以使其变得简单。
我想select from my_table where start_date <= now()
但是,由于时区,这不起作用。如果当前日期/时间是 12月1日东部时间晚上9点(即12月2日凌晨1点),上述查询将返回两个结果, 但我真的只想要第二个。夏令时使这变得更加复杂。
理想情况下,我想要一个执行以下操作的查询:
select * from my_table where convert_to_utc_timestamp(start_date,tz) <= now()
上述方法会将start_date转换为时间戳,然后将其转换为正确的时区。
我将如何在SQL中执行此操作?
答案 0 :(得分:3)
您可能会发现有两个功能很有用。
第一个是:
STR_TO_DATE(start_date,'%M %d,%Y')
这将使您的字符串以指定的格式转换为MySQL DATE
数据类型。
如果你有mysql.time_zone_name
等人。填充表格,您可以使用以下功能:
CONVERT_TZ()
(需要检查CONVERT_TZ
是否需要DATE并返回DATETIME或TIMESTAMP,或者在要转换的字符串中包含时间组件以获取DATETIME,例如
STR_TO_DATE( CONCAT(start_date,' 00:00:00'),'%M %d,%Y %T')
在CONVERT_TZ()函数中包装该表达式,例如
CONVERT_TZ( datetime_expr ,'US/Eastern','GMT')
要使用TZ
列中存储的值,这些值需要匹配,或者您需要找到一种方法来匹配mysql.time_zone_name
中存储的值表