我有一个SQL查询:
update party set left_time=(next_dose-dose)/power,takeoff=from_unixtime(unix_timestamp()+left_time);
我如何修改它而不使用unix时间来获得比2038-01-19更远的日期?
u59ebvdq1#
如果只需要从现在起left_time秒后的UTC时间,只需执行以下操作:
utc_timestamp() + interval left_time second
但这不是from_unixtime所做的;from_unixtime将生成会话所在时区的时间。如果这是您所需要的,您可以简单地这样做
current_timestamp() + interval left_time second
但如果即将进行夏令时过渡,则不会产生正确的结果,因此您必须执行以下操作:
convert_tz(utc_timestamp() + interval left_time second, '+00:00', @@SESSION.time_zone)
(An例如,为什么您应该始终只存储UTC时间,并且只转换它们以供显示。)如果takeoff是时间戳类型而不是日期时间,则必须执行此操作,因为无论何时您读取/更新它,它都会自动转换为会话时区或从会话时区转换,尽管它实际上存储的是UTC时间。
1条答案
按热度按时间u59ebvdq1#
如果只需要从现在起left_time秒后的UTC时间,只需执行以下操作:
但这不是from_unixtime所做的;from_unixtime将生成会话所在时区的时间。如果这是您所需要的,您可以简单地这样做
但如果即将进行夏令时过渡,则不会产生正确的结果,因此您必须执行以下操作:
(An例如,为什么您应该始终只存储UTC时间,并且只转换它们以供显示。)如果takeoff是时间戳类型而不是日期时间,则必须执行此操作,因为无论何时您读取/更新它,它都会自动转换为会话时区或从会话时区转换,尽管它实际上存储的是UTC时间。