The NR (Numeric Range) data type was introduced in HL7 v2.3 as the minimal composite for "a numeric interval, both endpoints required" — a pure low/high pair with no comparator and no separator metadata. Where SN can also express comparators and ratios, NR is the right choice for fields that are always an interval, never a single value, never a ratio. The canonical example in HL7 v2.8.1 is BUI-11 Transport Temperature, where a blood unit's permitted transport temperature is naturally a low^high range.
Purpose
NR carries an inclusive low/high numeric interval. It is the simplest of the range-bearing data types in HL7 v2 — two numbers and nothing else. The semantics are "the valid or observed value lies in [low, high]". NR is meant for fields whose definition makes the range non-negotiable: a transport temperature window, a reference range with both bounds known, a tolerance band on a measurement.
Components
Source: HAPI HL7v2 v2.8.1 javadoc (NR).
| Comp | Name | Sub-type | Length | Required | Description |
|---|---|---|---|---|---|
| NR.1 | Low Value | nm | — | O | Lower bound of the interval (inclusive). |
| NR.2 | High Value | nm | — | O | Upper bound of the interval (inclusive). |
In practice both components are required for the field to be meaningful; the standard marks them O at the datatype level because individual segment fields may further constrain conformance.
Most-used components
- NR.1 Low Value — the low bound; populated in every meaningful NR instance.
- NR.2 High Value — the high bound; required to make the range complete. Omitting it collapses NR back to a single-value form that the field's semantics do not support.
Where it's used
- BUI-11 Transport Temperature —
1^6for1–6 °C, paired with BUI-12 Transport Temperature Units (Cel^degree Celsius^UCUM). - OBX-7 References Range — when the field uses NR rather than ST; carries the lab-defined normal interval for a quantitative observation.
- Material-coverage fields in lab and supply-chain profiles where an acceptable storage range must be declared.
- Custom OBX panels reporting tolerance intervals for QC results.
- Reagent-stability fields in laboratory inventory messages bound to NR.
- Profile-specific equipment-operating-range fields (centrifuge speed range, incubator temperature).
- Master file (MFN) reference-data messages binding NR for normal/critical ranges.
Version differences
- HL7 v2.3 — NR introduced with the two-component Low / High layout.
- HL7 v2.4 through v2.8.1 — no structural changes; HAPI v2.8.1 javadoc shows the same two-component definition.
- HL7 v2.8.2 — no structural changes; minor narrative clarifications only.
NR has been one of the most stable composite types in HL7 v2 — two NM-typed components since introduction.
Common mistakes
- Sending a single value where the field requires a range (e.g.
4in BUI-11) — the field is NR; one number cannot be parsed as low^high and downstream validators will reject or warn. - Omitting NR.2 — collapses NR to an open-ended interval that the standard does not define; receivers may treat it as missing or as the low bound only.
- Swapping low and high (
6^1instead of1^6) — most engines preserve order literally, breaking range-membership checks downstream. - Using NR where SN would be correct — if the field can also carry comparators or ratios, the schema typically binds SN, not NR; check OBX-2 and the field definition.
- Locale-formatted decimals (
1,5^6,2) — NM sub-components require.as the decimal mark, locale-independent.
Examples
Minimal NR (transport temperature 1–6 °C):
1^6
Multi-component value (sub-unit-precision range):
0.5^1.5
Fully populated edge case — wide reference range crossing zero:
-2.5^2.5
In context — BUI-11 Transport Temperature in a BPS^O29:
BUI|1|W123426789012^^^RedCrossBB^DIN|E0336^RBC LR^HL70435|312|g^gram^UCUM|285|mL^milliliter^UCUM|REF-4R5400|LOT-88241A|Acme BioContainers Inc.|1^6|Cel^degree Celsius^UCUM
In context — OBX-7 reference range using NR:
OBX|1|NM|GLUC^Glucose^L||95||mg/dL|70^110|N|||F|||20260610141500-0500
Common pitfall — single value sent into an NR field:
BUI|1|...|...|...|...|...|...|...|...|4|Cel^...^UCUM <- WRONG; NR requires low^high
BUI|1|...|...|...|...|...|...|...|...|1^6|Cel^...^UCUM <- CORRECT
FHIR mapping
The v2-to-FHIR Implementation Guide publishes a per-datatype ConceptMap for NR:
The mapping is direct:
- NR.1 Low Value →
Range.low.value - NR.2 High Value →
Range.high.value
Units come from the surrounding field's unit slot (for example, BUI-12 Transport Temperature Units → Range.low.unit / Range.high.unit and Range.low.code / Range.high.code). Both Range.low.system and Range.high.system are set to UCUM when the source unit is UCUM-coded.
Engine considerations
- Low/high invariant: many engines validate
NR.1 <= NR.2and reject violations; senders that produce descending ranges (high-to-low) for descending scales should configure the validator to warn rather than block. - Single-value fallback: when the upstream system only has a single value, do not silently duplicate it into both NR.1 and NR.2 — that produces a degenerate interval that is technically valid but semantically misleading.
- Unit pairing: NR-typed fields are almost always paired with a separate units field (BUI-11 with BUI-12, OBX-7 with OBX-6). Engines must keep them in lock-step; dropping the unit field is a silent precision bug.
- Locale-independent decimals: NR inherits NM's strict
.decimal mark; format withLocale.ROOT. - Caret escaping: NR's
low^highrepresentation must not be confused with sub-component encoding by upstream renderers that aggressively escape^.
How Vorro parses and produces NR
On inbound, Vorro parses NR into a typed {low: BigDecimal, high: BigDecimal} pair. The low/high invariant is checked at parse time; violations are downgraded to soft warnings (rather than rejecting the message) because some lab interfaces emit descending bounds for inverse scales. The associated unit field is bound to the parsed NR record so consumers receive {low, high, units} as a single object.
On outbound, Vorro renders NR by formatting both components with Locale.ROOT and the correct precision for the bound units. Single-value sources are flagged at the connector boundary so an operator can decide between widening to a configured tolerance or producing a NUL field, rather than emitting a degenerate x^x interval.
