PostgreSQL中将tstzrange类型列转换为daterange类型报错的解决咨询
PostgreSQL中将tstzrange类型列转换为daterange类型报错的解决咨询
我之前也踩过这个坑,直接用y::daterange强制转换确实行不通,PostgreSQL不支持tstzrange到daterange的直接类型转换。你可以通过手动提取范围的上下限并重新构造daterange的方式来解决,还能保留原范围的开闭边界规则,具体SQL如下:
ALTER TABLE x ALTER COLUMN y TYPE daterange USING daterange( lower(y)::date, upper(y)::date, range_merge(y, y)::text );
简单解释下这段代码的作用:
lower(y)和upper(y)分别取出tstzrange列的起始、结束时间点,再通过::date转成日期类型range_merge(y, y)::text是为了获取原范围的边界修饰符(比如[)、[]这类),确保转换后的daterange和原范围的开闭规则完全一致,不会丢失范围的边界语义
如果你的业务场景不需要严格保留原边界模式(PostgreSQL中daterange默认是[)模式),也可以用简化版:
ALTER TABLE x ALTER COLUMN y TYPE daterange USING daterange(lower(y)::date, upper(y)::date);
我用这个方法转换过生产环境的表,没再出现报错,你可以试试~
内容来源于stack exchange
相关产品推荐
相关产品推荐

