把公开的舰艇建造时间线录进表格,我先被交付日期绕晕
前阵子整理一批公开舰艇的建造节点,想给每条船建三列:开工、下水、服役。数据来源是公开资料和船厂新闻稿,量不大,一百多条。第一版表格很快填完,看着挺整齐,直到我按服役年份排序,发现同型舰里出现服役早于下水的记录。
问题出在我把「交付」和「服役」当成了同一天。很多资料里写的是交付日期,船厂口径;服役日期是部队口径,两者中间还隔着试验、验收、编入序列。我最初的表格只有一列日期,来源不同也照抄不误。
改法很土,但管用:一条船拆成多行事件,而不是多列日期。
CREATE TABLE hull_event (
hull_id TEXT NOT NULL,
evt_type TEXT NOT NULL, -- laid_down / launched / delivered / commissioned
evt_date TEXT, -- ISO 8601,未知留 NULL
date_prec TEXT, -- day / month / year
source TEXT
);
关键是 date_prec。公开资料经常只给到年或月,硬填成某月一日,后面一排序就出鬼。我现在的规则是:精度到年就只存年份,比较时按区间处理,绝不补零成具体日期。另外加了 source,同一节点两个来源打架时能看见是谁说的。
为什么不用宽表?因为宽表逼你对每个格子负责,而公开资料本身是残缺的。窄表允许某条船只有开工和服役、没有下水,也允许同一事件有两条冲突记录,后面查起来是「有争议」而不是「错了」。代价是查询变啰嗦,看一条船的履历要聚合一次:
SELECT evt_type, evt_date, date_prec, source
FROM hull_event WHERE hull_id = ?
ORDER BY COALESCE(evt_date, '9999');
哪里会失效:一是资料里把「下水」写成「出坞」,两者对不同船型不是一回事,我目前只能人工判断后归到 launched,并在 source 里备注原文;二是改装后重新服役的船,commissioned 会出现两次,靠 evt_type 区分不了,得再加一列备注。我自己踩过的坑是把一艘转隶船的第二段服役期覆盖掉了第一段,排序看着正常,履历少了一段。
现在这批数据我不太敢拿来做「建造周期」统计,因为精度不齐,年月混算的均值意义不大。更实际的用法是查同型舰节点间隔的分布,比如开工到下水大概几个月,这个粒度下精度问题影响小一些。
想问一句:你们处理这类公开建造节点时,「交付」和「服役」是分开记的,还是按来源原样保留、统计时再归并?
0 条评论
还没有评论,写下第一条。