You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyMySQL结合SQL转换时区?现有代码返回None需解决

问题分析

你的代码存在三个核心问题:

  1. SQL字符串拼接错误:你把Python的变量拼接语法直接写在了SQL字符串里,导致MySQL收到的是字面量"+str(scheduled_start_time)+",而非变量的实际值,无法正确执行转换,因此返回None。
  2. 时区参数顺序颠倒:你期望输出16:00:00(UTC时间),说明需要将纽约时间12:00转换为UTC,但原代码中CONVERT_TZ的参数顺序是(时间, "UTC", 纽约时区),这是把UTC时间转成纽约时间,逻辑完全相反。
  3. 缺少日期信息: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:22:47