在mysql中将Date转换为UTC时间戳

时间:2012-12-18 21:08:57

标签: mysql sql timezone

我有一个包含以下列的表:

|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中执行此操作?

1 个答案:

答案 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中存储的值表