1

我有一个包含日期时间字段的表。我想选择具有以下条件的记录,即只有那些日期时间值高于当前 IST 时间的记录。

例子

select * from mytable where dt > current_ist_datetime

current_ist_datetime就是我不知道怎么用。CONVERT_TZ()NOW()可以给它。但我不知道mysql使用什么时区。也就是说,我不知道我应该传递给的第二个参数CONVERT_TZ()

4

2 回答 2

0

您可以使用 SQL 语句检索当前 MySQL 会话的时区设置:

mysql> SELECT @@session.time_zone;

如果 DBA 没有在 MySQL 上设置时区,它将默认为 的值SYSTEM,它代表操作系统上的时区。

http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html


跟进:

在您的示例 SQL 语句中的谓词中:

select * from mytable where dt > current_ist_datetime

(给定dtcurrent_ist_datetime数据类型DATETIME)值的比较将独立于任何时区转换,因为没有与DATETIME值关联的时区信息。

也就是说,从数据类型的列返回的值不受 MySQL 服务器 ( ) 或 MySQL 会话 ( )DATETIME的 time_zone 设置的影响。SELECT @@global.time_zoneSELECT @@session.time_zone

但是,该NOW()函数返回的值将受到会话的 time_zone 设置的影响。

要在 IST 中返回它,请确保正确指定会话的 time_zone,例如

SET VARIABLES time_zone = "+05:30"

(注意如果会话是从连接池中检索和返回的,则池中的其他用户可能不会期待不同的 time_zone;...)

(注意:以上完全忽略了 JDBC 驱动程序引入的混淆,这是由 MySQL 的 DATETIME 数据类型实现和 Java 实现 Date 对象之间的“阻抗不匹配”(差异)引起的。如果您通过 JDBC 连接传递 DATETIME 值,那是整个'另一个混乱的球。)

于 2013-06-09T12:37:04.767 回答
0

MySQL 以两种格式使用时区;即您可以使用“亚洲/加尔各答”或“+05:30”(对于 IST)。但我建议你使用后者。

UTC 的时区是“+00:00”。因此,您可以使用以下查询,只要它dt位于UTC&current_ist_datetime位于IST

select * from mytable where dt > CONVERT_TZ(current_ist_datetime,'+05:30','+00:00')

我在我的项目中使用这个查询,我从客户端(在 ISTcurrent_ist_datetime+05:30)到我的服务器(在 UTC 中),它就像一个魅力。

如果您使用NOW()mysql 将选择系统时区的当前日期时间

select * from mytable where dt > CONVERT_TZ(NOW(),'+05:30','+00:00')

您可以根据需要修改这些查询。

于 2015-08-14T08:29:18.127 回答