Foundation Types
Issuer: openEHR Specification Program  

Release: BASE Release1.2.0 
Status: STABLE 
Revision: [latest_issue] 
Date: [latest_issue_date] 
Keywords: openehr, identifiers, types 
© 2017  2021 The openEHR Foundation  

The openEHR Foundation is an independent, nonprofit foundation, facilitating the sharing of health records by consumers and clinicians via open specifications, clinical models and open platform implementations. 

Licence 
Creative Commons AttributionNoDerivs 3.0 Unported. https://creativecommons.org/licenses/bynd/3.0/ 
Support 
Issues: Problem Reports 
Amendment Record
Issue  Details  Raiser  Completed 

BASE Release 1.2.0 

SPECBASE34: Allow +14:00 timezone. 
S Iancu 

SPECBASE25: Improve and correct function definitions in Foundation types. Add 'nominal' computation functions to 
openEHR SEC 
30 Apr 2020 

BASE Release 1.1.0 

1.1.0 
SPECRM72: Add guidance on date/time formatting, recommending extended ISO 8601 format. 
B Lah 
22 Nov 2018 
SPECBASE15. Add foundation types specification to BASE component. 
T Beale 
19 Jul 2018 

SPECPUB6. Correct UML package nesting and paths in documents; insert 
T Beale 
27 Nov 2017 

0.7.6 
Reorganise heading structure. Remove references to ISO 11404. Rename to 'Foundation types'; 
T Beale 
17 Aug 2017 
0.7.0 
Initial Writing. Taken from openEHR RM Release 1.0.3 Support Model 
T Beale 
20 May 2016 
The Amendment history relevant to the original content in this specification can be found here (a fully hyperlinked version may be found on the working baseline).
Acknowledgements
Authors
This specification is developed and maintained by the openEHR Specifications Editorial Committee
1. Preface
1.1. Purpose
This document describes the openEHR Foundation Types, a collection of builtin and library types whose semantics are assumed by all other openEHR specifications.
The intended audience includes:

Standards bodies producing health informatics standards;

Research groups using openEHR, ISO 13606, archetypes and related technologies;

The open source healthcare community;

Solution vendors.
1.3. Status
This specification is in the STABLE state. The development version of this document can be found at https://specifications.openehr.org/releases/BASE/Release1.2.0/foundation_types.html.
Known omissions or questions are indicated in the text with a 'to be determined' paragraph, as follows:
TBD: (example To Be Determined paragraph)
1.4. Feedback
Feedback may be provided on the technical mailing list.
Issues may be raised on the specifications Problem Report tracker.
To see changes made due to previously reported issues, see the BASE component Change Request tracker.
1.5. Previous Versions
This specification is based on the types orginally defined in the openEHR Support Information Model from Release 1.0.3 of the Reference Model. Some changes have been made as follows.
1.5.1. Interval types
The additional types Point_interval
and Proper_interval
have been added, to support the common need for a point value and a proper interval to be specified as substitutable types. The types Multiplicity_interval
and Cardinality
have been added, from the AOM2 specification.
2. Overview
The openEHR Foundation Types (org.openehr.base.foundation_types
package) consists of generic low level types assumed by and used throughout the openEHR components and specifications. The types described here are specified in order to establish the names and minimal semantics of typical standard classes, as used by all other openEHR specifications, and to provide a mapping point into implementation technologies.
The set of types chosen here is based on a common set derived from various published sources, including:

Major interoperability formalisms, including OMG IDL, W3C XMLschema;

Major typed programming languages, including Java, C#, C++, etc.
The package structure is illustrated below.
base.foundation_types
PackageThe primitive_types
, structures
and time
packages describe types assumed by the openEHR specifcations to exist in any implementation technology, such as a programming language, schema language or database environment.
The functional
package includes types enabling functional programming primitives to be expressed in the openEHR modelling environment, i.e. functionsasobjects and 'lambda' expressions.
The types are described in this specification are typically of two kinds: builtin types, which are those built in to a type system of the development language, and library types, which are assumed to be available in a (class) library defined in the formalism. Thus, the type Boolean
is always assumed to exist in a formalism, while the type Array<T>
is assumed to be available in a library. For practical purposes, these two categories do not matter greatly  whether String
is really a library class (the usual case) or an inbuilt type doesn’t make much difference to the programmer. They are shown separately here mainly as an explanatory convenience. The builtin types are indicated in the UML with the «Value_type»
stereotype.
The assumptions that openEHR makes about existing types are documented below in terms of interface definitions. Each of these definitions contains only the assumptions required for the given type to be used in the openEHR type system  it is not by any means a complete interface definition. The name and semantics of any function used here for an assumed type might not be identical to those found in some implementation technologies. Any mapping required should be stated in the relevant implementation technology specification (ITS). To give a concrete example, where the assumed Set<T>
type defined below has an operation has (item: T): Boolean
which is used throughout the openEHR specifications, Java has the method contains()
on its Set<T>
class. In a Java implementation, the contains()
method should then be used throughout the openEHR classes as expressed in Java, in place of the has ()
method.
2.1. Operators
Some operations have symbolic or textual operator equivalents defined, in order to support parsing of textual form of expressions. Two categories of operator are supported via two stereotypes that add a list of Strings to an operation, enabling standard operators, and optionally, symbolic operators to be associated with a function. These are as follows.

«ops»
: default operator(s) for an operation, assumed to be expressible in normal text, for exmaple'='
forequal()
; 
«sym_ops»
: additional symbolic operators typically defined for mathematical and logical operations, e.g.'∀'
forContainer.for_all()
.
The main utility of such operators is to enable function signaturematching from parsed expressions. For example, the expression a_date_time  P1Y
(subtract a time period of 1 year from a date/time) has the signature <[Iso8601_duration], ?>
, equivalent to a function of the form func (dur: Iso8601_duration): ?
defined on the type Iso8601_date_time
(i.e. the return type is unknown until the function definition can be inferred). The correct function can be found on the latter type by searching for a function with the operator ''
and taking a single Iso8601_duration
argument. In this specification, this turns out to be the Iso8601_duration.subtract()
operation.
The operators provided by this means are not intended to prevent other kinds of operators being associated with functions defined on types in the openEHR specifications, rather they provide a minimal set for common operations.
2.2. The Any Class
Within all objectoriented and most other modern programming and modelling environments exists an ultimate ancestor type to which all others conform. In this specification, we assume the type Any
, which defines a bare minimum of operations, and stands for the real Any
or Object
type found in real technologies.
The primary operations specified are those for equality, i.e.:

equal(other: Any): Boolean
: returnTrue
if this andother
are equal in value for value types, and for reference types, if they refer to the same object; 
is_equal(other: Any): Boolean
: returnTrue
if this andother
are equal in value; typically redefined in descendants.
In these specifications, the equal()
operation is normally rendered using its operator, i.e. the '='
sign, while is_equal()
is always specified as a function call.
2.3. openEHR Leaf Types
The sections below provide formal definitions of all the foundation types used in openEHR. A subset of these can be understood as terminal or leaf types, typically used as terminal value types in other information models. The following diagram provides an aide memoire for the leaf types.
2.4. Class Definitions
2.4.1. Any Class
Class 
Any (abstract) 


Description 
Abstract ancestor class for all other classes. Usually maps to a type like 

Functions 
Signature 
Meaning 

1..1 
Value equality: return True if Parameters


1..1 
Reference equality for reference types, value equality for value types. Parameters


1..1 
Create new instance of a type. 

1..1 
Type name of an object as a string. May include generic parameters, as in 

1..1 
True if current object not equal to 
3. Primitive Types
3.1. Overview
This section describes primitive types assumed by all openEHR models. These are types supported directly by most programing languages, and usually visible via either a class interface and/or a builtin raw value type. The following table lists the primitive types assumed by openEHR.
Type name in openEHR 
Description 


a type whose value is an 8bit value. 

a type whose value is a member of an 8bit characterset (ISO: "repertoire"). 

logical True/False values; usually physically represented as an integer, but need not be. 

32bit integers. 

64bit integers. 

32bit real numbers in any interoperable representation, including singlewidth IEEE floating point. 

64bit real numbers, in any interoperable representation including doubleprecision IEEE floating point. 

represents unicodeenabled strings. 
The figure below illustrates these types. Simple inheritance relationships are shown which facilitate the type descriptions below. Actual inheritance from or subsitutability for an Any
class is not assumed, and is shown only for convenience (e.g. to indicate that the '=' operator is available on any type). The type Ordered_numeric
is on the other hand is used to indicate assumed substitutability of numeric types, and is intended to be mapped to an equivalent type in a real type system (e.g. in Java, java.lang.Number
). Dataoriented implementation type systems such as XMLschema do not have such operations.
base.foundation_types.primitive_types
Package3.2. Unicode
It is assumed in the openEHR specifications that Unicode is supported by the type String
. Unicode is needed for all Asian, Arabic and other script languages, for both data values (particularly plain text and coded text) and for many predefined string attributes of the classes in the openEHR Reference Model. It encompasses all existing character sets. In openEHR, UTF8 encoding is assumed.
3.3. Class Definitions
3.3.1. Boolean Class
Class 
Boolean 


Description 
Type representing minimal interface of builtin Boolean type. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
conjunction alias "and", "∧", "&" ( 
Logical conjunction of this with 
1..1 
semistrict_conjunction alias "and then", "&&" ( 
Boolean semistrict conjunction with 
1..1 
disjunction alias "or", "∨", "" ( 
Boolean disjunction with 
1..1 
semistrict_disjunction alias "or else", "" ( 
Boolean semistrict disjunction with 
1..1 
exclusive_disjunction alias "xor", "⊻" ( 
Boolean exclusive or with 
1..1 
implication alias "implies", "⇒" ( 
Boolean implication of 
1..1 
negation alias "not", "¬", "!" (): 
Boolean negation of the current value. 
Invariants 
Involutive_negation: 

Non_contradiction: 

Completeness: 
3.3.2. Ordered Class
Class 
Ordered (abstract) 


Description 
Abstract parent class of ordered types i.e. types on which the '<' operator is defined. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
Arithmetic value comparison. Returns True if current object is less than In conjunction with 

1..1 
less_than_or_equal alias "<=", "≤" ( 
True if current object less than or equal to 
1..1 
greater_than alias ">" ( 
True if current object greater than 
1..1 
greater_than_or_equal alias ">=", "≥" ( 
True if current object greater than or equal to 
3.3.3. Character Class
Class 
Character 


Description 
Type representing minimal interface of builtin Character type. 

Inherit 
3.3.4. Octet Class
Class 
Octet 


Description 
Type representing minimal interface of builtin Octet type. 

Inherit 
3.3.5. String Class
Class 
String 


Description 
Type representing minimal interface of builtin String type, as used to represent textual data in any natural or formal language. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
is_empty (): 
True if string is empty, i.e. equal to "". 
1..1 
is_integer (): 
True if string can be parsed as an integer. 
1..1 
as_integer (): 
Return the integer corresponding to the integer value represented in this string. 
1..1 
Concatenation operator  causes 

1..1 
Lexical comparison of string content based on ordering in relevant character set. 

1..1 
Return True if this String contains 
3.3.6. Uri Class
Class 
Uri 


Description 
A kind of String constrained to obey the syntax of RFC 3986. 

Inherit 
3.3.7. Numeric Class
Class 
Numeric (abstract) 


Description 
Abstract parent class of numeric types, which are types which have various arithmetic and comparison operators defined. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
Sum with 

1..1 
Result of subtracting 

1..1 
Product by 

1..1 
Divide by`other`. Actual type of result depends on arithmetic balancing rules. 

1..1 
Expontiation of this by 

1..1 
negative alias "" (): 
Generate negative of current value. 
3.3.8. Ordered_Numeric Class
Class 
Ordered_Numeric (abstract) 


Description 
Abstract notional parent class of ordered, numeric types, which are types with both the 

Inherit 
3.3.9. Integer Class
Class 
Integer 


Description 
Type representing minimal interface of builtin Integer type. 

Inherit 

Functions 
Signature 
Meaning 

1..1 
Integer addition. 

1..1 
Integer subtraction. 

1..1 
Integer multiplication. 

1..1 
Integer division. 

1..1 
Integer exponentiation. 

1..1 
Return self modulo other. 

1..1 
Returns True if current Integer is less than 

1..1 
negative alias "" (): 
Generate negative of current Integer value. 

1..1 
Value equality: return True if Parameters


1..1 
Reference equality for reference types, value equality for value types. Parameters

3.3.10. Integer64 Class
Class 
Integer64 


Description 
Type representing minimal interface of builtin Integer64 type. 

Inherit 

Functions 
Signature 
Meaning 

1..1 
Large integer addition. 

1..1 
Large integer subtraction. 

1..1 
Large integer multiplication. 

1..1 
Large integer division. 

1..1 
Large integer exponentiation. 

1..1 
Large integer modulus. 

1..1 
Returns True if current Integer is less than 

1..1 
negative alias "" (): 
Generate negative of current Integer value. 

1..1 
Value equality: return True if Parameters


1..1 
Reference equality for reference types, value equality for value types. Parameters

3.3.11. Real Class
Class 
Real 


Description 
Type used to represent decimal numbers. Corresponds to a singleprecision floating point value in most languages. 

Inherit 

Functions 
Signature 
Meaning 

1..1 
floor (): 
Return the greatest integer no greater than the value of this object. 

1..1 
Real number addition. 

1..1 
Real number subtraction. 

1..1 
Real number multiplication. 

1..1 
Real number division. 

1..1 
Real number exponentiation. 

1..1 
Returns True if current Real is less than 

1..1 
negative alias "" (): 
Generate negative of current Real value. 

1..1 
Value equality: return True if Parameters


1..1 
Reference equality for reference types, value equality for value types. Parameters

3.3.12. Double Class
Class 
Double 


Description 
Type used to represent doubleprecision decimal numbers. Corresponds to a doubleprecision floating point value in most languages. 

Inherit 

Functions 
Signature 
Meaning 

1..1 
floor (): 
Return the greatest integer no greater than the value of this object. 

1..1 
Doubleprecision real number addition. 

1..1 
Doubleprecision real number subtraction. 

1..1 
Doubleprecision real number multiplication. 

1..1 
Doubleprecision real number division. 

1..1 
Doubleprecision real number exponentiation. 

1..1 
Returns True if current Double is less than 

1..1 
negative alias "" (): 
Generate negative of current Double value. 

1..1 
Value equality: return True if Parameters


1..1 
Reference equality for reference types, value equality for value types. Parameters

4. Structure Types
4.1. Overview
The types described in this section are basic data structures assumed to be standardly available in implementation technologies. The following types consititute the minimum set of structure types assumed by openEHR of an implementation environment.
Type name in openEHR 
Description 


physical container of items indexed by number 

container of items, implied order, nonunique membership 

container of items, no order, unique membership 

a table of values of any type V, keyed by values of any 
The following UML diagram illustrates the base.foundation_types.structures
package. As with the primitive types, inheritance and abstract classes are used for convenience of the definitions in openEHR models, but are not assumed to exist in exactly the same way within implementation technologies. Hence, in an implementation, various workarounds or equivalences may be needed to obtain the defined semantics.
base.foundation_types.structures
package4.2. Class Definitions
4.2.1. Container Class
Class 
Container<T> (abstract) 


Description 
Abstract ancestor of container types whose items are addressable in some way. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
has ( 
Test for membership of a value. 
1..1 
count (): 
Number of items in container. 
1..1 
is_empty (): 
True if container is empty. 
1..1 
there_exists alias "there exists", "∃" ( 
Existential quantifier applied to container, taking one agent argument 
1..1 
for_all alias "for all", "∀" ( 
Universal quantifier applied to container, taking one agent argument 
0..1 
matching ( 
Return a List all items matching the predicate function 
0..1 
select ( 
Return first item matching the predicate function 
4.2.2. List Class
Class 
List<T> 


Description 
Ordered container that may contain duplicates. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
first (): 
Return first element. 
1..1 
last (): 
Return last element. 
Invariants 
First_validity: 

Last_validity: 
4.2.3. Set Class
Class 
Set<T> 


Description 
Unordered container that may not contain duplicates. 

Inherit 
4.2.4. Array Class
Class 
Array<T> 


Description 
Container whose storage is assumed to be contiguous. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
item alias "[]" ( 
Return item for key 
4.2.5. Hash Class
Class 
Hash<K,V> 


Description 
Type representing a keyed table of values. V is the value type, and K the type of the keys. 

Inherit 

Functions 
Signature 
Meaning 
1..1 
has_key ( 
Test for presence of 
1..1 
item alias "[]" ( 
Return item for key 
5. Interval
5.1. Overview
Another kind of structure commonly needed in rich data is the interval. The definition of the Interval<T>
class here is an intensional one, i.e. it states its members by implication from its limits, rather than enumerating them. To support the common need for defining times in models that could be either a fixed point in time or a time interval, the classes Point_interval<T>
and Proper_interval<T>
are provided. If Interval<X>
is defined as the type of a feature in a class in an openEHR model, where X
is some descendant of Ordered
, then at runtime, either a Point_interval
or Proper_interval
may be attached.
In addition to the generic interval types, the derived types Multiplicity_interval
and Cardinality
are provided, for use in models to represent multiplicity, optionality, and cardinality.
The following UML diagram illustrates the interval
package.
base.foundation_types.interval
package5.2. Class Definitions
5.2.1. Interval Class
Class 
Interval<T> (abstract) 


Description 
Interval abstraction, featuring upper and lower limits that may be open or closed, included or not included. Interval of ordered items. 

Inherit 

Attributes 
Signature 
Meaning 
0..1 
lower: 
Lower bound. lower bound. 
0..1 
upper: 
Upper bound. Upper bound. 
1..1 
lower_unbounded: 

1..1 
upper_unbounded: 

1..1 
lower_included: 

1..1 
upper_included: 

Functions 
Signature 
Meaning 
1..1 
has ( 
True if the value 
1..1 
True if there is any overlap between intervals represented by Current and 

1..1 
True if current interval properly contains 

1..1 
True if current object’s interval is semantically same as 

Invariants 
Lower_included_valid: 

Upper_included_valid: 

Limits_consistent: 

Limits_comparable: 
5.2.2. Point_interval Class
Class 
Point_interval<T> 


Description 
Type representing an Interval that happens to be a point value. Provides an efficient representation that is substitutable for 

Inherit 

Attributes 
Signature 
Meaning 
1..1 
lower_unbounded: 
Lower boundary open (i.e. = infinity). 
1..1 
upper_unbounded: 
Upper boundary open (i.e. = +infinity). 
1..1 
lower_included: 
Lower boundary value included in range if not 
1..1 
upper_included: 
Upper boundary value included in range if not 
Invariants 
Inv_point: 
5.2.3. Proper_interval Class
Class 
Proper_interval<T> 


Description 
Type representing a 'proper' Interval, i.e. any twosided or onesided interval. 

Inherit 

Invariants 
Inv_not_point: 
5.2.4. Multiplicity_interval Class
Class 
Multiplicity_interval 


Description 
An Interval of Integer, used to represent multiplicity, cardinality and optionality in models. 

Inherit 

Constants 
Signature 
Meaning 
1..1 
Multiplicity_range_marker: 
Marker to use in string form of interval between limits. 
1..1 
Multiplicity_unbounded_marker: 
Symbol to use to indicate upper limit unbounded. 
Functions 
Signature 
Meaning 
1..1 
is_open (): 
True if this interval imposes no constraints, i.e. is set to 
1..1 
is_optional (): 
True if this interval expresses optionality, i.e. 
1..1 
is_mandatory (): 
True if this interval expresses mandation, i.e. 
1..1 
is_prohibited (): 
True if this interval is set to 
5.2.5. Cardinality Class
Class 
Cardinality 


Description 
Express constraints on the cardinality of container objects which are the values of multiplyvalued attributes, including uniqueness and ordering, providing the means to state that a container acts like a logical list, set or bag. 

Attributes 
Signature 
Meaning 
1..1 
interval: 
The interval of this cardinality. 
1..1 
is_ordered: 
True if the members of the container attribute to which this cardinality refers are ordered. 
1..1 
is_unique: 
True if the members of the container attribute to which this cardinality refers are unique. 
Functions 
Signature 
Meaning 
1..1 
is_bag (): 
True if the semantics of this cardinality represent a bag, i.e. unordered, nonunique membership. 
1..1 
is_list (): 
True if the semantics of this cardinality represent a list, i.e. ordered, nonunique membership. 
1..1 
is_set (): 
True if the semantics of this cardinality represent a set, i.e. unordered, unique membership. 
6. Time Types
6.1. Overview
The primitive Date/Time types used in openEHR are represented by classes defined in the package base.foundation_types.time
. These are concrete types based on the ISO 8601 (2019) date/time standard semantics, which supports partial dates, times, and complex durations, all of which are needed in the biomedical and clinical domains. These classes have a String
physical representation. and are assumed to exist in close to the form specified here, because they are specified in other openEHR specifications.
The time
package is shown below.
base.foundation_types.time
package6.2. Primitive Time Types
The set of ISO 8601 based types define dates and times with a String
representation (as per ISO 8601), and the ISO 8601 'partial' and 'extended' semantics. They are defined as descendents of the native types described above, and add the necessary elements required for ISO 8601.
Note

class names of the form Iso8601_xxx have been used here to clearly identify these classes where used elsewhere in the openEHR specifications. In real implementations, other class names may be used as convenient, just as for the other primitive types.

Note

For reasons of readability in data, it is strongly recommended that the 'extended' form of date and time strings be used when writing and displaying data, rather than the compact form. An extended date has the form yyyymmdd rather than yyyymmdd , and an extended time has the form hh:mm:ss rather than hhmmss . Nevertheless, both forms should be supported so that openEHRbased systems that use 'straightthrough' processing on legacy data that may be in the compact form remain conformant to the specifications.

ISO 8601 semantics not included in these types include:

'expanded' dates, which have year numbers of greater than 4 digits, and may be negative; in openEHR, only 4digit year numbers are assumed;

the
YYYYWWDD
method of expressing dates (since this is imprecise and difficult to compute with due to variable week starting dates, and not required in health); 
partial date/times with fractional minutes or hours, e.g.
hh,hhh
ormm,mm
; in openEHR, only fractional seconds are supported; 
the interval syntax. Intervals of date/times are supported in openEHR, but their syntax form is defined by ADL, and is standardised across all comparable types, not just dates and times.
Deviations from the published standard include the following.

Durations are supposed to take the form of
PnnW
orPnnYnnMnnDTnnHnnMnnS
, but in openEHR, the W (week) designator can be used in combination with the other designators, since it is very common to state durations of pregnancy as some combination of weeks and days. 
Durations in openEHR may take a negative sign, indicating a duration prior to an origin. This supports healthcare needs such as 'adjusted age' (e.g. 'P3M', an age of 'minus 3 months') for very premature newborns.

Partial variants of
Iso8601_date_time
can include missing hours, days and months, whereas ISO 8601:2019 (section 4.3.3 c) only allows missing seconds and minutes. The reasons for this deviation are:
the same deviation is used in HL7v2 and HL7v3 TS (timestamp) type, i.e. there are data in existing clinical systems matching this specification;

in a typed object model, this deviation is more sensible anyway; the ISO 8601 rule is most likely a limitation of the purely syntactic means of expression. In real systems where a timestamp/datetime is specified in a screen form, it makes sense to allow it to be as partial as possible, rather than artifically restricted to only missing seconds and minutes.


The time
24:00:00
(or240000
) is not allowed anywhere, whereas in ISO 8601:2019 it appears to be legal at least for pure times. This deviation is also appears to be used in HL7v2 and HL7v3 (where midnight is defined as the time00:00:00
), and is preferable to the documented standard, since a date/time with time of24:00:00
is really the next day, i.e. the date part is then incorrect.
Negation for ISO 8601 durations is also supported by W3C XMLschema and various programming languages. See Wikipedia and the official ISO 8601 standard for details. Note that in the date, time and date/time formats shown below, 'Z' and 'T' are literals. In the duration class shown below, 'P', 'Y', 'M', 'W', 'D', 'H', 'S' and 'T' are literals.
6.3. Derived Interval / Time Types
A number of useful types may be generated from the Date/time classes and the Interval classes. These are shown in blue on the following diagram.
6.4. Computational Functions
A number of computational functions are defined in the interfaces of the concrete data/time types, of two kinds:

definite: computed according to the usual numeric rules for arithmetic, in which all values are treated as definite, i.e. exact and invariant;

nominal: computed using commonly accepted rules of 'everyday' calendrical time, in which 'year' and 'month' are understood to be variable periods.
Most of the functions defined on the date/time types are of the definite kind. The exception is functions involving Iso8601_duration
values, which take both definite and nominal forms. The definite forms are named using the standard names add()
, subtract()
etc, while the nominal versions have names of the form xxx_nominal()
, e.g. add_nominal()
etc.
An example of an operation having both forms is addition for the type Iso8601_date
. The definite operation is called add()
and treats the Iso8601_duration
argument as an exact amount, based on constant values for length of year and month, defined by Time_definitions.Average_days_in_month
and Time_definitions.Average_days_in_year
.
The nominal form of the operation is add_nominal()
, and is computed according to 'everyday' rules, i.e. in which the phrase 'a year from now' means the same date next year (with occasional slight adjustment), and 'in a month' means the same date next month (or possibly a day or more earlier due to next month being shorter). In a similar way, the addition of a period of one day ('P1D'
), although itself a regular quantity is computed differently to the definite form: in the definite form, addition of P1D
results in the addition of exactly 24h of time to the date, which may result in a time that is different by one hour due to a change of summer time during the interval, while the nominal addition results in the same time on the next of previous day, even though occasionally this will represent 23 or 25 hours' difference.
The definite functions have standard operators such as '+'
, ''
, etc associated with them, while the nominal functions have the operators '++'
, ''
, etc.
6.5. Class Definitions
6.5.1. Time_Definitions Class
Class 
Time_Definitions 


Description 
Definitions for date/time classes. Note that the timezone limits are set by where the international dateline is. Thus, time in New Zealand is quoted using 

Constants 
Signature 
Meaning 

1..1 
Seconds_in_minute: 
Number of seconds in a minute. 

1..1 
Minutes_in_hour: 
Number of minutes in an hour. 

1..1 
Hours_in_day: 
Number of clock hours in a day, i.e. 24. 

1..1 
Average_days_in_month: 
Used for conversions of durations containing months to days and / or seconds. 

1..1 
Max_days_in_month: 
Maximum number of days in any month. 

1..1 
Days_in_year: 
Calendar days in a normal year, i.e. 365. 

1..1 
Average_days_in_year: 
Used for conversions of durations containing years to days and / or seconds. 

1..1 
Days_in_leap_year: 
Calendar days in a standard leap year, i.e. 366. 

1..1 
Max_days_in_year: 
Maximum number of days in a year, i.e. accounting for leap years. 

1..1 
Days_in_week: 
Number of days in a week. 

1..1 
Months_in_year: 
Number of months in a year. 

1..1 
Min_timezone_hour: 
Minimum hour value of a timezone according to ISO 8601 (note that the ve sign is supplied in the 

1..1 
Max_timezone_hour: 
Maximum hour value of a timezone according to ISO 8601. 

1..1 
Nominal_days_in_month: 
Used for conversions of durations containing months to days and / or seconds. 

1..1 
Nominal_days_in_year: 
Used for conversions of durations containing years to days and / or seconds. 

Functions 
Signature 
Meaning 

1..1 
True if 

1..1 
valid_month ( 
True if 

1..1 
valid_day ( 
True if 

1..1 
valid_hour ( 
True if 

1..1 
valid_minute ( 
True if 

1..1 
valid_second ( 
True if 

1..1 
valid_fractional_second ( 
True if 

1..1 
String is a valid ISO 8601 date, i.e. takes the complete form:
Where:
The combinations of 

1..1 
String is a valid ISO 8601 date, i.e. takes the form:
with an additional optional timezone indicator of:
Where:


1..1 
String is a valid ISO 8601 datetime, i.e. takes the form:


1..1 
String is a valid ISO 8601 duration, i.e. takes the form:
Where each nn represents a number of years, months, etc. Note: allowing the Parameters
Where each

6.5.2. Temporal Class
Class 
Temporal (abstract) 


Description 
Abstract ancestor of timerelated classes. 

Inherit 
6.5.3. Iso8601_type Class
Class 
Iso8601_type (abstract) 


Description 
Abstract ancestor type of ISO 8601 types, defining interface for 'extended' and 'partial' concepts from ISO 8601. 

Inherit 

Attributes 
Signature 
Meaning 
1..1 
value: 
Representation of all descendants is a single String. 
Functions 
Signature 
Meaning 
1..1 
is_partial (): 
True if this date time is partial, i.e. if trailing end (right hand) value(s) is/are missing. 
1..1 
is_extended (): 
True if this ISO8601 string is in the 'extended' form, i.e. uses 
6.5.4. Iso8601_date Class
Class 
Iso8601_date 


Description 
Represents an ISO 8601 date, including partial and extended forms. Value may be:
See 

Inherit 

Functions 
Signature 
Meaning 
1..1 
year (): 
Extract the year part of the date as an Integer. 
1..1 
month (): 
Extract the month part of the date as an Integer, or return 0 if not present. 
1..1 
day (): 
Extract the day part of the date as an Integer, or return 0 if not present. 
1..1 
timezone (): 
Timezone; may be Void. 
1..1 
month_unknown (): 
Indicates whether month in year is unknown. If so, the date is of the form 
1..1 
day_unknown (): 
Indicates whether day in month is unknown. If so, and month is known, the date is of the form 
1..1 
is_partial (): 
True if this date is partial, i.e. if days or more is missing. 
1..1 
is_extended (): 
True if this date uses 
1..1 
as_string (): 
Return string value in extended format. 
1..1 
add alias "+" ( 
Arithmetic addition of a duration to a date. 
1..1 
subtract alias "" ( 
Arithmetic subtraction of a duration from a date. 
1..1 
diff alias "" ( 
Difference of two dates. 
1..1 
add_nominal alias "++" ( 
Addition of nominal duration represented by

1..1 
subtract_nominal alias "" ( 
Subtraction of nominal duration represented by 
Invariants 
Year_valid: 

Month_valid: 

Day_valid: 

Partial_validity: 
6.5.5. Iso8601_time Class
Class 
Iso8601_time 


Description 
Represents an ISO 8601 time, including partial and extended forms. Value may be:
See


Inherit 

Functions 
Signature 
Meaning 

1..1 
hour (): 
Extract the hour part of the date/time as an Integer. 

1..1 
minute (): 
Extract the minute part of the time as an Integer, or return 0 if not present. 

1..1 
second (): 
Extract the integral seconds part of the time (i.e. prior to any decimal sign) as an Integer, or return 0 if not present. 

1..1 
fractional_second (): 
Extract the fractional seconds part of the time (i.e. following to any decimal sign) as a Real, or return 0.0 if not present. 

1..1 
timezone (): 
Timezone; may be Void. 

1..1 
minute_unknown (): 
Indicates whether minute is unknown. If so, the time is of the form “hh”. 

1..1 
second_unknown (): 
Indicates whether second is unknown. If so and month is known, the time is of the form 

1..1 
is_decimal_sign_comma (): 
True if this time has a decimal part indicated by 

1..1 
is_partial (): 
True if this time is partial, i.e. if seconds or more is missing. 

1..1 
is_extended (): 
True if this time uses 

1..1 
has_fractional_second (): 
True if the 

1..1 
as_string (): 
Return string value in extended format. 

1..1 
add alias "+" ( 
Arithmetic addition of a duration to a time. 

1..1 
subtract alias "" ( 
Arithmetic subtraction of a duration from a time. 

1..1 
diff alias "" ( 
Difference of two times. 

Invariants 
Hour_valid: 

Minute_valid: 

Second_valid: 

Fractional_second_valid: 

Partial_validity: 
6.5.6. Iso8601_date_time Class
Class 
Iso8601_date_time 


Description 
Represents an ISO 8601 date/time, including partial and extended forms. Value may be:
See Note that this class includes 2 deviations from ISO 8601:2004:


Inherit 

Functions 
Signature 
Meaning 
1..1 
year (): 
Extract the year part of the date as an Integer. 
1..1 
month (): 
Extract the month part of the date/time as an Integer, or return 0 if not present. 
1..1 
day (): 
Extract the day part of the date/time as an Integer, or return 0 if not present. 
1..1 
hour (): 
Extract the hour part of the date/time as an Integer, or return 0 if not present. 
1..1 
minute (): 
Extract the minute part of the date/time as an Integer, or return 0 if not present. 
1..1 
second (): 
Extract the integral seconds part of the date/time (i.e. prior to any decimal sign) as an Integer, or return 0 if not present. 
1..1 
fractional_second (): 
Extract the fractional seconds part of the date/time (i.e. following to any decimal sign) as a Real, or return 0.0 if not present. 
1..1 
timezone (): 
Timezone; may be Void. 
1..1 
month_unknown (): 
Indicates whether month in year is unknown. 
1..1 
day_unknown (): 
Indicates whether day in month is unknown. 
1..1 
minute_unknown (): 
Indicates whether minute in hour is known. 
1..1 
second_unknown (): 
Indicates whether minute in hour is known. 
1..1 
is_decimal_sign_comma (): 
True if this time has a decimal part indicated by 
1..1 
is_partial (): 
True if this date time is partial, i.e. if seconds or more is missing. 
1..1 
is_extended (): 
True if this date/time uses 
1..1 
has_fractional_second (): 
True if the 
1..1 
as_string (): 
Return the string value in extended format. 
1..1 
add alias "+" ( 
Arithmetic addition of a duration to a date/time. 
1..1 
subtract alias "" ( 
Arithmetic subtraction of a duration from a date/time. 
1..1 
diff alias "" ( 
Difference of two date/times. 
1..1 
add_nominal alias "++" ( 
Addition of nominal duration represented by 
1..1 
subtract_nominal alias "" ( 
Subtraction of nominal duration represented by 
Invariants 
Year_valid: 

Month_valid: 

Day_valid: 

Hour_valid: 

Minute_valid: 

Second_valid: 

Fractional_second_valid: 

Partial_validity_year: 

Partial_validity_month: 

Partial_validity_day: 

Partial_validity_hour: 

Partial_validity_minute: 
6.5.7. Iso8601_duration Class
Class 
Iso8601_duration 


Description 
Represents an ISO 8601 duration, which may have multiple parts from years down to seconds. The


Inherit 

Functions 
Signature 
Meaning 

1..1 
is_extended (): 
Returns True. 

1..1 
is_partial (): 
Returns False. 

1..1 
years (): 
Number of years in the 

1..1 
months (): 
Number of months in the 

1..1 
days (): 
Number of days in the 

1..1 
hours (): 
Number of hours in the 

1..1 
minutes (): 
Number of minutes in the 

1..1 
seconds (): 
Number of seconds in the 

1..1 
fractional_seconds (): 
Fractional seconds in the 

1..1 
weeks (): 
Number of weeks in the 

1..1 
is_decimal_sign_comma (): 
True if this time has a decimal part indicated by ',' (comma) rather than '.' (period). 

1..1 
to_seconds (): 
Total number of seconds equivalent (including fractional) of entire duration. Where nondefinite elements such as year and month (i.e. 'Y' and 'M') are included, the corresponding 'average' durations from 

1..1 
as_string (): 
Return the duration string value. 

1..1 
add alias "+" ( 
Arithmetic addition of a duration to a duration, via conversion to seconds, using 

1..1 
subtract alias "" ( 
Arithmetic subtraction of a duration from a duration, via conversion to seconds, using 

1..1 
multiply alias "*" ( 
Arithmetic multiplication a duration by a number. 

1..1 
divide alias "/" ( 
Arithmetic division of a duration by a number. 

1..1 
negative alias "" (): 
Generate negative of current duration value. 

Invariants 
Years_valid: 

Months_valid: 

Weeks_valid: 

Days_valid: 

Hours_valid: 

Minutes_valid: 

Seconds_valid: 

Fractional_second_valid: 
6.5.8. Iso8601_timezone Class
Class 
Iso8601_timezone 


Description 
ISO8601 timezone string, in format:
where:


Inherit 

Functions 
Signature 
Meaning 
1..1 
hour (): 
Extract the hour part of timezone, as an Integer in the range 
1..1 
minute (): 
Extract the hour part of timezone, as an Integer, usually either 0 or 30. 
1..1 
sign (): 
Direction of timezone expresssed as +1 or 1. 
1..1 
minute_unknown (): 
Indicates whether minute part known. 
1..1 
is_partial (): 
True if this time zone is partial, i.e. if minutes is missing. 
1..1 
is_extended (): 
True if this timezone uses ‘:’ separators. 
1..1 
is_gmt (): 
True if timezone is UTC, i.e. 
1..1 
as_string (): 
Return timezone string in extended format. 
Invariants 
Min_hour_valid: 

Max_hour_valid: 

Minute_valid: 

Sign_valid: 
7. Terminology Package
7.1. Overview
The base.foundation_types.terminology
package provides leaf types used to represent a terminology code, i.e. a code within a terminology, and a term, which is the combination of a code and one rubric (natural language) string associated with it. Terminology codes are sometimes called concept codes among terminology experts, and when used as references, concept references.
An instance of Terminology_code
is a reference to any referenceable entity within a terminology or ontology, which may be:

a single term, for which a rubric(s) and potentially relationships (at least the
ISA
relationship) are defined; 
a value set i.e. a set of single terms, possibly in a tree or other structure corresponding to relationships between the member terms;

any other terminological entity referencable with a code.
An instance of Terminology_term
provides a way to record a terminology code and the rubric used in some operational context, allowing the receiver or reader of the data to avoid having to perform a terminology lookup to obtain the rubric, e.g. for display purposes.
base.foundation_types.terminology
package7.2. Class Definitions
7.2.1. Terminology_term Class
Class 
Terminology_term 


Description 
Leaf type representing a standalone term from a terminology, which consists of the term text and the code, i.e. a concept reference. 

Inherit 

Attributes 
Signature 
Meaning 
1..1 
concept: 
Reference to the terminology concept formally representing this term. 
1..1 
text: 
Text of term. 
7.2.2. Terminology_code Class
Class 
Terminology_code 


Description 
Primitive type representing a standalone reference to a terminology concept, in the form of a terminology identifier, optional version, and a code or code string from the terminology. 

Inherit 

Attributes 
Signature 
Meaning 
1..1 
terminology_id: 
The archetype environment namespace identifier used to identify a terminology. Typically a value like 
0..1 
terminology_version: 
Optional string value representing terminology version, typically a date or dotted numeric. 
1..1 
code_string: 
A terminology code or postcoordinated code expression, if supported by the terminology. The code may refer to a single term, a value set consisting of multiple terms, or some other entity representable within the terminology. 
0..1 
uri: 
The URI reference that may be used as a concrete key into a notional terminology service for queries that can obtain the term text, definition, and other associated elements. 
8. Functional Metatypes
8.1. Overview
A small number of metatypes are defined that correspond to functional programming primitives, otherwise known as 'closures', 'lambda expressions' and so on. These concepts are supported in most modern programming languages now, and the types defined here are intended to provide a minimal formal basis to enable other openEHR specification to defined functionrelated elements. Since UML does not contain native functional elements, the semantics here are approximated using normal class facilities.
The following illustrates the functional
package.
Two key abstractions are required, namely 'function as a type', and 'tuple', which enables arguments to be formalised. To provide a 'function' type, a 'routine' type is also required. For completeness, a 'procedure' type is also defined. The 'tuple' type is defined as a generic metatype whose descendants may additionally define any number of generic parameter types, corresponding to a type list.
8.1.2. ROUTINE Class
Class 
ROUTINE<ARGS> 


Description 
Type representing a function with a return type and 0 or more arguments represented as a TUPLE. 
8.1.3. FUNCTION Class
Class 
FUNCTION<ARGS,RESULT> 


Description 
Type representing a function with a return type and 0 or more arguments represented as a TUPLE. 

Inherit 
8.1.4. PROCEDURE Class
Class 
PROCEDURE<ARGS> 


Description 
Type representing a procedure with 0 or more arguments represented as a TUPLE. 

Inherit 
8.1.6. TUPLE1 Class
Class 
TUPLE1<A> 


Description 
A Tuple type used, among other things, for representing a single typed argument within a Routine signature. 

Inherit 
9. Type CrossReference
The following table provides a crossreference from openEHR foundation types to their equivalents in common implementation formalisms. Where there is no equivalent listed, a specific library may still exist, or an implementation may be required of the openEHR specification.
Type name in openEHR 
Description  XML  Java  C# 


8bit value. 
 



a member of an 8bit characterset. 




logical True/False values. 




32bit integers. 




64bit integers. 




32bit real numbers 




64bit real numbers 




Unicodeenabled strings. 




Contiguous Array. 




Ordered List. 




Unordered, unique membership container. 




Uniquekeyed map. 
(various) 



Interval of ordered types. 
 
 


Native date type. 




Native time type. 




Native date/time type. 




Native duration type. 




ISO 8601encoded date type. 

use 
(use formatted string) 

ISO 8601encoded time type. 

use j`ava.text.SimpleDateFormat` 
(use formatted string) 

ISO 8601encoded date/time type. 

use 
(use formatted string) 

ISO 8601encoded duration type. 

use 
(use formatted string) 

Interval of Integer. 
 
(various) 
 

Interval of Date. 
 
(various) 
 

Interval of Time. 
 
(various) 
 

Interval of DateTime. 
 
(various) 
 