OpenQuery解析5位年份日期异常,Python psycopg2读取报错求助
问题分析与解决方案
1. OpenQuery解析逻辑推测
PostgreSQL中该列应为字符串类型(因为date类型无法存储194809-01-13这种无效日期),OpenQuery在自动转换字符串为日期时触发了私有容错解析逻辑,推测步骤如下:
- 将字符串按
-分割为三个片段:["194809", "01", "13"] - 识别到第一个片段
194809作为年份超出合理范围,截断前4位作为有效年份:1948 - 对剩余数字部分(
09、01、13)进行算术运算生成月日:- 日期:将三个数字相加得到
9+1+13=23 - 月份:取
09除以3的整数结果3
- 日期:将三个数字相加得到
- 组合得到最终日期
1948-03-23
这种逻辑是OpenQuery为兼容格式错误的日期字符串设计的非标准容错规则。
2. Python端实现相同处理逻辑
根据上述推测的规则,可编写Python代码实现相同转换:
def parse_openquery_date(date_str): parts = date_str.split('-') if len(parts) != 3: raise ValueError("Invalid date string format") # 提取4位有效年份 year = int(parts[0][:4]) # 提取各段数字 extra_num = int(parts[0][4:]) if len(parts[0]) > 4 else 0 month_num = int(parts[1]) day_num = int(parts[2]) # 按OpenQuery推测规则计算月日 day = extra_num + month_num + day_num month = extra_num // 3 # 格式化输出(确保月日为两位数字) return f"{year}-{month:02d}-{day:02d}" # 测试示例 input_date = "194809-01-13" print(parse_openquery_date(input_date)) # 输出:1948-03-23
如果实际解析规则有细微差异(比如月份计算逻辑不同),可根据实际情况调整代码中的算术步骤。
内容的提问来源于stack exchange,提问作者ShChawla
相关产品推荐
相关产品推荐

