如何用PyMySQL结合SQL转换时区?现有代码返回None需解决
问题分析
你的代码存在三个核心问题:
- SQL字符串拼接错误:你把Python的变量拼接语法直接写在了SQL字符串里,导致MySQL收到的是字面量
"+str(scheduled_start_time)+",而非变量的实际值,无法正确执行转换,因此返回None。 - 时区参数顺序颠倒:你期望输出16:00:00(UTC时间),说明需要将纽约时间12:00转换为UTC,但原代码中
CONVERT_TZ的参数顺序是(时间, "UTC", 纽约时区),这是把UTC时间转成纽约时间,逻辑完全相反。 - 缺少日期信息:
CONVERT_TZ需要完整的datetime格式(包含日期),因为时区偏移可能受夏令时影响,仅传递时间字符串无法准确计算偏移量。
解决方案
1. 确保MySQL时区表已加载
首先确认你的MySQL服务器已加载时区表,否则CONVERT_TZ会返回NULL。如果未加载,在Linux环境执行以下命令:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
执行后重启MySQL服务即可。
2. 修正代码(使用参数化查询,避免SQL注入)
import pymysql # 替换为你的数据库连接信息 conn = pymysql.connect( host='localhost', user='your_username', password='your_password', database='your_database', cursorclass=pymysql.cursors.DictCursor ) cursor = conn.cursor() # 传入完整的datetime字符串,包含日期 scheduled_datetime = "2024-01-01 12:00:00" source_timezone = "America/New_York" target_timezone = "UTC" # 参数化查询,安全传递变量 cursor.execute( 'SELECT CONVERT_TZ(%s, %s, %s) AS converted_time', (scheduled_datetime, source_timezone, target_timezone) ) result = cursor.fetchone() if result['converted_time']: # 提取时间部分输出 converted_time = result['converted_time'].strftime("%H:%M:%S") print(converted_time) # 输出 16:00:00 cursor.close() conn.close()
3. 若必须仅使用时间字符串(不推荐)
如果确实只能用时间字符串,需手动拼接固定日期(比如2024-01-01)来构造datetime,规避夏令时影响:
scheduled_time = "12:00:00" # 拼接成完整datetime格式 scheduled_datetime = f"2024-01-01 {scheduled_time}" # 后续代码同上
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

