我有一个 MySQL 数据库,其中一列的类型为 DATETIME
并将值存储在 IST 中(因为我的服务器时区是 IST
)。
我从用户那里获取了 EST
中的两个字符串,我需要将数据库中的日期部分与该列进行匹配。
我正在使用此查询:
SELECT * FROM my_table where date(convert_tz(`myDate`,'+05:30','-05:00'))
between '2012-12-01' and '2012-12-02';
注意:在我的数据库中 mysql.time_zone
是空的,这意味着我不能在查询中使用诸如GMT等
字符串,他们指示我下载一个包,但我不想下载它,我可以使用
00:05`,因为我将用 Java 构建我的查询。
这个查询运行良好,因为我已经硬编码了时区偏移量(对于EST
。
但我担心此查询会为夏令时日期(即 EDT
)提供错误的数据。
那么我如何获得时区差异(意味着它应该返回 '-05:00' 为 EST 和 '-04:00 为 EDT ),以便我可以在 java 中构建查询字符串时直接使用它们。
我的查询字符串可能如下所示:
SELECT * FROM my_table where date(convert_tz(`myDate`,'+05:30','???'))
between '2012-12-01' and '2012-12-02';
我想要 ??? 的值使用准备好的语句动态分配。
我正在使用 Joda Time API,但对其了解不多,不知道它是否有可以返回给定时区字符串的时区offser的东西。
最佳答案
我建议:
- 为了保持理智,您开始将值存储为 UTC。 (数据不应取决于服务器的位置。)
- 您可以在 Java 中计算起点/终点的 UTC 值(使用正确时区设置的
DateTime
,然后转换为 UTC) - 您可以通过 SQL 参数将 UTC 开始/结束时间直接传递到查询中(不要在 SQL 文本中包含这些值),并避免数据库进行任何转换
如果您确实无法更改数据库以使用 UTC,则应该将“目标时区”值转换为 IST 值,并将这些值传递到数据库。同样,查询不需要进行转换:而是预先转换您的输入。
关于java - 如何通过 joda 中的 id 知道时区与 GMT 的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13879348/