把公开的舰艇建造时间线录进表格,我先被交付日期绕晕

前阵子整理一批公开舰艇的建造节点,想给每条船建三列:开工、下水、服役。数据来源是公开资料和船厂新闻稿,量不大,一百多条。第一版表格很快填完,看着挺整齐,直到我按服役年份排序,发现同型舰里出现服役早于下水的记录。

问题出在我把「交付」和「服役」当成了同一天。很多资料里写的是交付日期,船厂口径;服役日期是部队口径,两者中间还隔着试验、验收、编入序列。我最初的表格只有一列日期,来源不同也照抄不误。

改法很土,但管用:一条船拆成多行事件,而不是多列日期。

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
赞同度 100% · 0 条评论 · 3 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。