Wikidata查询时如何仅返回日期属性的实际已知精度内容?
Wikidata日期属性按原始精度返回解决方案
方案1:直接返回对应精度的日期字符串
Wikidata的日期时间值自带精度元数据,可通过wikibase:timePrecision属性获取,对应精度规则如下:
- 精度值9:仅记录年份
- 精度值10:仅记录年份+月份
- 精度值11:记录完整的年/月/日
你可以在SPARQL查询中通过判断精度值,动态格式化输出对应精度的日期,避免默认补全1月1日的问题,查询示例如下:
SELECT ?item ?itemLabel ?formattedBirthDate WHERE { ?item wdt:P569 ?birthDate . ?birthDate wikibase:timePrecision ?precision . BIND(YEAR(?birthDate) AS ?year) BIND(MONTH(?birthDate) AS ?month) BIND(DAY(?birthDate) AS ?day) # 按精度格式化日期 BIND( IF(?precision = 9, STR(?year), IF(?precision = 10, CONCAT(STR(?year), "-", STRPAD(STR(?month), 2, "0", 1)), CONCAT(STR(?year), "-", STRPAD(STR(?month), 2, "0", 1), "-", STRPAD(STR(?day), 2, "0", 1)) ) ) AS ?formattedBirthDate ) SERVICE wikibase:label { bd:serviceParam wikibase:language "zh,en" . } # 可自行添加限制条件缩小查询范围,示例为仅查询人物条目 ?item wdt:P31 wd:Q5 . } LIMIT 100
方案2:额外新增日期精度列
如果不需要格式化日期,仅需要区分真实1月1日和系统补全的1月1日,可直接在查询结果中新增精度列即可:
SELECT ?item ?itemLabel ?birthDate ?precision WHERE { ?item wdt:P569 ?birthDate . ?birthDate wikibase:timePrecision ?precision . SERVICE wikibase:label { bd:serviceParam wikibase:language "zh,en" . } ?item wdt:P31 wd:Q5 . } LIMIT 100
内容的提问来源于stack exchange,提问作者jmwink
相关产品推荐
相关产品推荐

