无法修改现有数据库,如何留存FHIR请求中的时区信息?
我之前在维护老医疗系统的时候碰到过几乎一模一样的问题,老库动不了确实头疼,给你几个经过验证的可行方案,你可以根据自己的系统架构选:
可行解决方案
1. 蹭现有表的预留字段存时区信息
如果你的业务表有预留的闲置字符串字段(比如Remark、ExtInfo这类当初留着备用的字段),这是成本最低的方案:
- 接收FHIR JSON时,先把原始的带时区ISO日期字符串(比如
2024-05-20T14:30:00+08:00)完整保留,拆分出DateTime部分(转成你现在用的DateTime类型存入现有字段)和时区偏移(比如+08:00)。 - 把时区偏移或者完整的ISO字符串塞进预留字段里,不用改任何数据库结构。
- 当FHIR客户端查询时,从数据库取出
DateTime和预留字段里的时区信息,重新拼接成符合要求的带时区ISO格式返回。 - 优点:零数据库改动,实现快;缺点:如果没有闲置字段就用不了,要注意字段长度限制,别存不下。
2. 新增辅助表做时区映射(如果允许新增表的话)
如果现有业务表绝对不能改,但数据库允许新增表的话,这个方案最规范:
- 建一个轻量的辅助表,比如
FhirDateTimeTimezone,字段至少包括:MainRecordId:关联业务表主键的外键OriginalIsoDate:存储完整的带时区原始日期字符串(用VARCHAR(50)足够)
- 接收FHIR请求时,插入业务表记录的同时,往辅助表插一条关联的时区信息。
- 查询时,通过业务表主键关联辅助表,取出原始ISO日期直接返回给FHIR客户端就行。
- 优点:不污染现有业务数据,结构清晰;缺点:需要新增表,查询时多一次关联,增加了一点代码复杂度。
3. 取巧复用DateTime的时间部分(仅限日期字段的时间无业务意义时)
如果你的数据库Date列映射到C#的DateTime,但实际上只用到了日期部分,时间部分完全闲置,那可以把时区信息编码进时间部分:
- 把时区偏移转成分钟数(比如
+08:00就是480分钟),对应成时间(08:00:00),存入DateTime的时间部分。 - 查询时,把时间部分转回时区偏移,再和日期部分组合成带时区的ISO字符串。
- 优点:完全不用改数据库和实体类,黑科技拉满;缺点:仅限时间部分无业务用途的场景,编码解码要写工具类,容易出错,不推荐用于核心业务数据。
关键注意事项
- 一定要先存原始ISO字符串:别先把FHIR日期转成
DateTime再去捞时区,转完之后时区信息就丢干净了,第一步必须先提取并保存原始的带时区日期字符串。 - 返回时要严格符合FHIR格式:拼接出来的ISO日期要带正确的时区偏移(比如
±HH:mm,不能只写时区缩写),避免客户端解析出错。
内容的提问来源于stack exchange,提问作者JhonMalk199
相关产品推荐
相关产品推荐

