我有一个包含日期时间字段的表。我想选择具有以下条件的记录,即只有那些日期时间值高于当前 IST 时间的记录。
例子
select * from mytable where dt > current_ist_datetime
current_ist_datetime
就是我不知道怎么用。CONVERT_TZ()和NOW()可以给它。但我不知道mysql使用什么时区。也就是说,我不知道我应该传递给的第二个参数CONVERT_TZ()
我有一个包含日期时间字段的表。我想选择具有以下条件的记录,即只有那些日期时间值高于当前 IST 时间的记录。
例子
select * from mytable where dt > current_ist_datetime
current_ist_datetime
就是我不知道怎么用。CONVERT_TZ()和NOW()可以给它。但我不知道mysql使用什么时区。也就是说,我不知道我应该传递给的第二个参数CONVERT_TZ()
您可以使用 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
(给定dt
和current_ist_datetime
数据类型DATETIME
)值的比较将独立于任何时区转换,因为没有与DATETIME
值关联的时区信息。
也就是说,从数据类型的列返回的值不受 MySQL 服务器 ( ) 或 MySQL 会话 ( )DATETIME
的 time_zone 设置的影响。SELECT @@global.time_zone
SELECT @@session.time_zone
但是,该NOW()
函数返回的值将受到会话的 time_zone 设置的影响。
要在 IST 中返回它,请确保正确指定会话的 time_zone,例如
SET VARIABLES time_zone = "+05:30"
(注意如果会话是从连接池中检索和返回的,则池中的其他用户可能不会期待不同的 time_zone;...)
(注意:以上完全忽略了 JDBC 驱动程序引入的混淆,这是由 MySQL 的 DATETIME 数据类型实现和 Java 实现 Date 对象之间的“阻抗不匹配”(差异)引起的。如果您通过 JDBC 连接传递 DATETIME 值,那是整个'另一个混乱的球。)
MySQL 以两种格式使用时区;即您可以使用“亚洲/加尔各答”或“+05:30”(对于 IST)。但我建议你使用后者。
UTC 的时区是“+00:00”。因此,您可以使用以下查询,只要它dt
位于UTC
¤t_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')
您可以根据需要修改这些查询。