"""确认能耗报表"今日/本月"的时区口径。 背景:服务返回 today_energy=6000(= 2026-09-19 那天的数据),而本机 pymysql 连接下 CURDATE() 是 2026-09-20。差异来自 **sqlx 会把 MySQL 会话时区设成 +00:00** (保证时间转换确定性),而普通客户端沿用服务器的默认会话时区。 """ import pymysql conn = pymysql.connect(host="10.8.0.252", user="root", password="Hbhyg731024@", database="pms_dev") cur = conn.cursor() cur.execute("SELECT @@global.time_zone, @@session.time_zone, NOW(), CURDATE()") print("默认会话时区 :", cur.fetchone()) cur.execute("SET time_zone = '+00:00'") cur.execute("SELECT @@session.time_zone, NOW(), CURDATE()") print("模拟 sqlx(+00:00) :", cur.fetchone()) TODAY = "cr.start_time >= CURDATE() AND cr.start_time < CURDATE() + INTERVAL 1 DAY" THIS_MONTH = ( "cr.start_time >= DATE_FORMAT(CURDATE(), '%Y-%m-01') " "AND cr.start_time < DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH, '%Y-%m-01')" ) cur.execute(f"SELECT CAST(COALESCE(SUM(cr.energy),0) AS SIGNED) FROM charge_records cr WHERE {TODAY}") print("UTC 会话下 today :", cur.fetchone()[0], "(服务实测返回 6000 ✓)" if cur.rowcount else "") cur.execute(f"SELECT CAST(COALESCE(SUM(cr.energy),0) AS SIGNED) FROM charge_records cr WHERE {THIS_MONTH}") print("UTC 会话下 month :", cur.fetchone()[0], "(服务实测返回 6990 ✓)") # start_time 在两种会话时区下的呈现(TIMESTAMP 列按会话时区转换) cur.execute("SET time_zone = '+08:00'") cur.execute("SELECT id, cabinet_id, start_time FROM charge_records ORDER BY id LIMIT 3") print("+08:00 会话读 start_time :", cur.fetchall()) cur.execute("SET time_zone = '+00:00'") cur.execute("SELECT id, cabinet_id, start_time FROM charge_records ORDER BY id LIMIT 3") print("+00:00 会话读 start_time :", cur.fetchall()) cur.close() conn.close()