从CSV文件加载interval类型数据报错,年份区间字段应选什么数据类型?
建造年份列(bouwjaar)数据类型选型方案
首先明确报错原因:
date类型要求输入为合法的完整日期值(如1971-01-01),仅年份或年份区间不符合格式要求;interval类型用于存储时间长度(如'10 years'),不支持存储起止时间点组成的区间,所以会触发取值越界报错。
可根据你的后续使用需求选择以下合适的类型:
- 文本类型(
varchar/text)
仅需要存储原始值、不需要做年份范围的计算、筛选时优先选择。最长的年份区间格式为4位起始年+横杠+4位结束年共9个字符,指定varchar(9)即可,或者直接使用text类型,导入无格式适配成本,实现最简单。 - 拆分双整数列
后续需要频繁做范围筛选(比如查询所有包含1975年的记录)时选择,将原始bouwjaar拆分为bouwjaar_start和bouwjaar_end两个smallint类型列:- 可先将原始值导入临时文本列,再用字符串切割函数拆分出起止年份转成整数存入对应列
smallint的存储范围是-32768到32767,完全覆盖常见年份取值,存储空间比文本小,筛选计算效率更高
- 范围类型(PostgreSQL专属)
如果你使用的是PostgreSQL数据库,可直接用int4range类型存储年份区间,支持原生的范围匹配操作,比如判断某一年是否在区间内、区间是否重叠等,转换示例代码:-- 新增区间类型列 ALTER TABLE fundadata ADD COLUMN bouwjaar_range int4range; -- 从原始文本值转换为区间值 UPDATE fundadata SET bouwjaar_range = int4range( split_part(bouwjaar_raw, '-', 1)::integer, split_part(bouwjaar_raw, '-', 2)::integer, '[]' -- []表示区间包含起止年份 );
内容的提问来源于stack exchange,提问作者Eri Bytyci
相关产品推荐
相关产品推荐

