运行SQL代码时出现admission_datetime的timestamp类型输入语法错误求助
排查并修复timestamp语法错误问题
我来帮你搞定这个报错!你遇到的invalid input syntax for type timestamp错误,核心是错误地把timestamp类型的值和空字符串做比较,咱们一步步拆解问题并修复:
错误根源:类型不匹配的非法比较
你在CASE语句里写了date_trunc('day',admission_datetime) = '',这里有两个关键问题:
date_trunc返回的是timestamp/date类型,而''是文本字符串,数据库尝试把空字符串转成timestamp时直接失败,这就是报错的直接原因。- 逻辑上完全没必要:你已经判断了
admission_datetime IS NULL,而date_trunc处理NULL值返回的还是NULL,timestamp类型的字段根本不可能存储空字符串,只会是NULL或者合法的时间值。
修复后的SQL代码
去掉和空字符串的无效比较,同时优化CASE语句的可读性,修正后的代码如下:
UPDATE ccsm.stg_demographics_baseline SET xx_los_days = ( CASE -- 如果入院时间为空,直接返回NULL WHEN admission_datetime IS NULL THEN NULL -- 如果出院时间为空,计算入院到当前日期的天数差 WHEN discharge_datetime IS NULL THEN DATE_DIFF('day', admission_datetime, CURRENT_DATE) -- 否则计算入院到出院的天数差 ELSE DATE_DIFF('day', admission_datetime, discharge_datetime) END );
额外适配说明
如果你的数据库不支持DATE_DIFF函数(比如PostgreSQL),需要换成对应数据库的语法:
-- PostgreSQL 适配版本 UPDATE ccsm.stg_demographics_baseline SET xx_los_days = ( CASE WHEN admission_datetime IS NULL THEN NULL WHEN discharge_datetime IS NULL THEN CURRENT_DATE - DATE(admission_datetime) ELSE DATE(discharge_datetime) - DATE(admission_datetime) END );
另外建议你先检查admission_datetime和discharge_datetime字段的脏数据:如果有存储了非时间格式的字符串(比如乱码、无效日期),也会触发类似的类型错误,需要先清理这些记录再执行更新。
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

