3

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

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

4

1 回答 1

3

您可能会发现有两个功能很有用。

第一个是:

STR_TO_DATE(start_date,'%M %d,%Y')

这将使您的字符串以指定的格式转换为 MySQLDATE数据类型。如果你有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表中的值。

于 2012-12-18T21:30:13.633 回答