验证HL7 Schema中的时间戳?

时间:2016-08-18 15:55:52

标签: validation schema hl7 hl7-v2 intersystems-healthshare

我在默认的2.3架构中看到TSDT数据类型:

<SegmentStructure name='SMPL' description='Patient Identification'>
    <SegmentSubStructure piece='1' description='A sample datetime field' datatype='DT' max_length='12' required='O' ifrepeating='0'/>
</SegmentStructure>

<DataType name='TS' description='time stamp'>
    <DataSubType piece='1' description='time of an event' datatype='ST'/>
    <DataSubType piece='2' description='degree of precision' datatype='ST'/>
</DataType>

<DataType name='DT' description='Date (2.8.13)'>
    <DataSubType piece='1' description='Date (2.8.13)'/>
</DataType>

但它似乎并没有真正验证格式。这可能吗?我们最近有一个实例,客户正在发送一个缺少数字的时间戳(例如20160503120)。如果可以的话,我想用架构验证这一点。

修改 希望添加一些澄清

我们使用,当ADT进入时,它会通过扩展名为.hl7的验证程序。默认情况下,这是2.3.hl7或类似的(取决于版本)。它看起来就像上面的代码。我想知道我是否可以以某种方式将正则表达式放在那里。在段结构定义(SMPL)或数据类型定义中。

3 个答案:

答案 0 :(得分:1)

v2文档有这样美:

YYYY[MM[DD[HH[MM[SS[.S[S[S[S]]]]]]]]][+/-ZZZZ]

括号表示可选部分。也许只看一下断点?像这样的东西?假设您首先拆分时区,然后将其传递给您实际用于解析日期的任何内容。

switch (datePart.length) {
case 4:
  return parseDate(datePart, "YYYY");
case 6:
  return parseDate(datePart, "YYYYMM");
case 8:
  return parseDate(datePart, "YYYYMMDD");
case 10:
  return parseDate(datePart, "YYYYMMDDHH");
case 12:
  return parseDate(datePart, "YYYYMMDDHHmm");
case 14:
  return parseDate(datePart, "YYYYMMDDHHmmss");
case 16:
  return parseDate(datePart, "YYYYMMDDHHmmss.S");
case 17:
  return parseDate(datePart, "YYYYMMDDHHmmss.SS");
case 18:
  return parseDate(datePart, "YYYYMMDDHHmmss.SSS");
default:
  return undefined;
}

答案 1 :(得分:0)

您可以向架构添加正则表达式。这是来自v3模式的完整TS正则表达式:

[0-9] {1,8} |([0-9] {9,14} |。[0-9] {14,14} [0-9] +)([+ - ] [ 0-9] {1,4})?

答案 2 :(得分:0)

根据HL7 v2的规范(见http://www.hl7.eu/refactored/dtDTM.html),DT的格式为:YYYY [MM [DD [HH [MM [SS [.S [S [S [S]]]]] ]]]] [+/- ZZZZ]。

因此,正确的正则表达式将是: ^((\d{2}){2,7}|\d{14}.\d{1,4}([+-]\d{4})?)$

但是,如果您正在谈论TS数据类型,它可能包括插入符号和精度指示符。

在这种情况下,正则表达式可能是: ^((\d{2}){2,7}|\d{14}.\d{1,4}([+-]\d{4})?)(\^[YLDHMS])?$

这只是第一次筛选,因为实际日期/时间值未经过验证。