使用SQLGlot解析含UTC格式时间戳的SQL时遇解析错误求助
解决SQLGlot解析UTC格式时间戳SQL的报错问题
报错原因
SQL语法中,UTC格式的时间戳属于字符串字面量,必须用单引号包裹。你的查询里时间戳没加引号,SQLGlot会把2024-03-20T23:45:43.216000+00:00当成连续的减法运算(2024 - 03 - 20),后续的T23就成了无法识别的无效token,导致解析失败。
解决方案
方法1:手动给时间戳添加单引号
直接修改SQL语句,把UTC时间戳用单引号括起来,代码示例:
from sqlglot import parse_one, exp # 修正后的SQL:时间戳加单引号 q = 'SELECT Info,Type,Username FROM MyTbl WHERE EventDate >= \'2024-03-20T23:45:43.216000+00:00\' AND EventDate <= \'2024-03-21T00:50:00.637052+00:00\' ORDER BY EventDate DESC LIMIT 10000' column_list = [] table_list = [] # 提取列名 for column in parse_one(q).find_all(exp.Column): col = column.alias_or_name column_list.append(col) # 提取表名 for table in parse_one(q).find_all(exp.Table): tbl = table.name table_list.append(tbl) print("列名:", column_list) print("表名:", table_list)
执行后会正常输出:
列名: ['Info', 'Type', 'Username', 'EventDate', 'EventDate', 'EventDate'] 表名: ['MyTbl']
方法2:自动给UTC时间戳加引号(适合批量处理)
如果无法手动修改SQL,可以用正则表达式匹配UTC格式的时间戳,自动替换为带单引号的版本:
import re from sqlglot import parse_one, exp def fix_utc_timestamp(sql): # 匹配UTC时间格式:YYYY-MM-DDTHH:MM:SS.ssssss+HH:MM pattern = r'(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}\+\d{2}:\d{2})' # 替换为带单引号的形式 return re.sub(pattern, r"'\1'", sql) # 原始SQL original_q = 'SELECT Info,Type,Username FROM MyTbl WHERE EventDate >= 2024-03-20T23:45:43.216000+00:00 AND EventDate <= 2024-03-21T00:50:00.637052+00:00 ORDER BY EventDate DESC LIMIT 10000' # 修复后的SQL fixed_q = fix_utc_timestamp(original_q) # 提取列名和表名 column_list = [col.alias_or_name for col in parse_one(fixed_q).find_all(exp.Column)] table_list = [tbl.name for tbl in parse_one(fixed_q).find_all(exp.Table)] print("列名:", column_list) print("表名:", table_list)
注意事项
- 正则表达式可以根据你实际的时间戳格式调整(比如有的时间戳可能没有毫秒部分,或者时区格式不同)
- 不同SQL方言对时间字面量的处理可能略有差异,但加单引号是通用的标准写法
内容的提问来源于stack exchange,提问作者user1717931
相关产品推荐
相关产品推荐

