默认东8区
SET time_zone = '+08:00';
CONVERT_TZ 第二个参数:按照 网上说是 明确指定源时区是UTC(0时区)当前数据库服务器是东8区,查询的结果第一个data 就差8个小时,第二个 beijing列 是对的
此时 临时将数据库设置0时区
SET time_zone = '+00:00';
查询的结果第一个data 就是对的,第二个 beijing列 也是对的
再次验证
再次验证 CONVERT_TZ 的第二个参数到底是当前数据库所在时区的动态值,还是按照网上说的就是0时区(明确指定源时区是UTC(0时区)),
我们将时区转换为任意一个时区,并且 CONVERT_TZ 第二个参数也设置相同的时区,看结果是否正确,如果正确 说明 CONVERT_TZ第二个参数不是网上说的 明确指定源时区是UTC0时区,应该是当前数据库所在的时区,
我们假设随机设置 东12 时区
结果和预想的一样
得出结果
CONVERT_TZ 第二个参数 应该是当前服务器所在的时区,而不是网上说的 明确指定源时区是UTC(0时区),说的这个前提的当时数据库服务器在0时区没问题,如果不在0时区就不对
附上sql
-- 临时将数据库设置为某个时区
SET time_zone = '+12:00';
-- 查询当前会话时区
SELECT @@session.time_zone AS session_time_zone;
-- 定义一个表 里面有个字段 table_start_time 存 毫米级的时间戳
-- CONVERT_TZ 第一个参数: FROM_UNIXTIME( table_start_time / 1000 ) 转换为秒的时间戳 数据库存储时间戳是 1747267200000
-- CONVERT_TZ 第二个参数:网上说是 明确指定源时区是UTC(0时区),前提是当前数据库服务器是0时区的时间,如果不是0时区转换后的目标时区就不对
-- CONVERT_TZ 第三个参数:是指定的目标时区,要将此时间戳转换为某个时区的时间
SELECT
CONVERT_TZ( FROM_UNIXTIME( table_start_time / 1000 ), '+12:00', '+08:00' ) AS date,
CONVERT_TZ( FROM_UNIXTIME( table_start_time / 1000 ), @@SESSION.time_zone, '+08:00' ) AS biejing,
id
FROM
tb_teacher_free_time
WHERE
del_flag = '0'
AND teacher_id = 9670074263
-- 再次验证 CONVERT_TZ 的第二个参数到底是当前数据库所在时区的动态值,还是按照网上说的就是0时区(明确指定源时区是UTC(0时区)),
-- 我们将时区转换为任意一个时区,并且 CONVERT_TZ 第二个参数也设置相同的时区,看结果是否正确,如果正确 说明 CONVERT_TZ第二个参数不是网上说的 明确指定源时区是UTC0时区,
-- 应该是当前数据库所在的时区,我们假设随机设置 东12 时区
-- CONVERT_TZ 第二个参数 应该是当前服务器所在的时区,而不是网上说的 明确指定源时区是UTC(0时区),说的这个前提的当时数据库服务器在0时区没问题,如果不在0时区就不对