我有一个包含以下列的表格:
|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 点(UTC 时间 12 月 2 日凌晨 1 点),以上查询将返回两个结果, 但我真的只想要第二个。夏令时使情况更加复杂。
理想情况下,我想要执行以下操作的查询:
select * from my_table where convert_to_utc_timestamp(start_date,tz) <= now()
上述方法会将 start_date 转换为时间戳,然后将其转换为正确的时区。
我如何在 SQL 中执行此操作?
最佳答案
您可能会发现两个有用的函数。
第一个是:
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
表。
关于mysql - 在mysql中将日期转换为UTC时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13941542/