What Is an Onset Date: 2026 OMOP ETL Mapping Guide

Dr. Jennifer LeeDr. Jennifer Lee
May 8, 2026
23 min read
What Is an Onset Date: 2026 OMOP ETL Mapping Guide

You're probably staring at a source table that has symptom_date, diagnosis_date, problem_list_start, first_note_mention, and maybe a patient questionnaire field that says “started years ago.” Someone asks for a progression cohort, a time-to-treatment analysis, or a disability-related timeline. The obvious question sounds simple: what is an onset date?

It usually isn't simple.

In production ETL, onset date is one of those fields that looks harmless until it breaks a study. Pick the wrong date, and your cohort entry shifts. Your treatment windows move. Your survival curves drift. Your model starts learning documentation behavior instead of disease behavior. If you work in OMOP, onset date isn't just another timestamp. It's the temporal anchor that tells the rest of the record how to line up.

A good data engineer learns to treat onset the way a surveyor treats a benchmark. If the benchmark is wrong, every downstream measurement is wrong in a consistent, dangerous way. That's why onset work belongs near the top of your ETL design, not as a cleanup task at the end.

The Critical Role of the Onset Date in Health Data

A new engineer often assumes the earliest date is the right date. In health data, that shortcut fails fast.

Take a common example. A patient first notices hand weakness at home, mentions it in a portal message later, receives a diagnosis after a neurology workup, and starts treatment after that. Those are all real dates. Only one of them may represent clinical onset, and a different one may be the right date for an administrative workflow.

The problem gets bigger when data comes from multiple systems. The EHR may store diagnosis timing in structured tables, while the first symptom only appears in free text. A registry might capture self-reported onset. Claims might only show the first billable encounter. If you collapse all of that into “first seen date,” you're no longer modeling the condition. You're modeling the health system's documentation trail.

Why engineers should care

Onset date affects more than one use case:

  • Cohort definition: Some studies need symptom onset, not diagnosis date.
  • Treatment sequencing: You can't measure delay from onset to therapy if onset is really first coded diagnosis.
  • Bias control: If onset is shifted later than reality, time-to-event analyses can mislead.
  • Benefits and eligibility workflows: Administrative systems may use a formal onset determination with legal consequences.

The OMOP model gives you a place to store temporality, but it doesn't decide what your source date means. That interpretation is your job.

Practical rule: Before mapping any date, ask “onset of what, according to whom, and captured where?”

That single question prevents a lot of bad ETL.

A useful mental model

Think of onset date as the start line, not the checkpoint. Diagnosis date is often a checkpoint. First prescription is another checkpoint. Hospital admission is another. Engineers get into trouble when they confuse the first checkpoint they can reliably query with the true start line they need.

When a dataset lacks a trustworthy onset date, the right move isn't to pretend. It's better to label the date accurately, preserve provenance, and design analyses around that limitation.

Understanding Onset Date Variations

A new data engineer often hits the same problem on week one of an OMOP ETL. The source gives three dates for what looks like the same condition. One comes from a symptom questionnaire, one from the problem list, and one from a benefits workflow. All three can be called an onset date. Only one may belong in the analytic event you are building.

The confusion starts because "onset" is a business term, a clinical term, and sometimes a legal term. Each use answers a different question. If you do not separate those questions early, your ETL logic will blur them together and analysts will read more certainty into the data than the source supports.

A practical framing for engineers is simple. One date asks when the condition likely began in the patient. Another asks when the care team documented it. Another asks when an organization accepted that date for a formal purpose.

Three common meanings

AttributeClinical Onset DateAdministrative Onset Date (e.g., SSA EOD)Alleged/Self-Reported Onset
Primary purposeRepresent first symptom or signDetermine formal eligibilityCapture patient or claimant account
Typical sourceClinical notes, structured symptom fields, assessmentsAdjudication records, work history, medical evidenceIntake forms, interviews, questionnaires
PrecisionOften uncertain or inferredFormal and documentedVariable and sometimes approximate
Best useDisease progression, cohort timing, causal analysesBenefits and legal workflowsSupporting evidence, timeline reconstruction
Main riskBuried in unstructured textCan differ from symptom onsetRecall bias

Clinical onset often requires interpretation

Clinical onset is rarely handed to you as a clean field named onset_date. More often, you infer it from symptom documentation, assessment text, flowsheets, or a coded observation that points to timing. That is why temporal ETL work feels less like column mapping and more like evidence ranking.

A patient saying "the cough started last Thursday" is different from a clinician documenting pneumonia two days later. Both are useful. They represent different points on the timeline. If you want a sharper distinction between what the patient experienced and what the clinician observed, read the difference between symptoms and signs.

LOINC also reflects that onset may be captured directly. LOINC 11368-8, "Illness or injury onset date and time," is one example of a standardized way a source system can represent this concept. In practice, many feeds still bury onset in text or spread it across several fields with uneven reliability.

Administrative onset is a determined date

Administrative onset has a narrower purpose. It is the date accepted by an organization under its own rules, evidence standards, and workflow constraints. For disability programs, that can be the established onset date used to determine benefit timing and eligibility.

For OMOP engineers, the main lesson is semantic. Administrative onset is not automatically the same as first symptom, first diagnosis, or first impairment severe enough to be clinically obvious. It is a decision date anchored to policy and documentation standards.

That distinction matters in ETL. If your source mixes clinical and administrative dates in one column family, you need a rule set that keeps their provenance visible.

Alleged or self-reported onset is early evidence

Self-reported onset is often the first clue that a timeline exists at all. It can point your ETL toward the earliest plausible disease window, especially in neurology, behavioral health, and chronic conditions that develop gradually.

It also needs context.

A statement such as "pain started about two winters ago" is useful evidence, but it is still approximate. Your pipeline should preserve that statement's role in the timeline without it being automatically promoted to a high-confidence condition start date. In OMOP terms, that often means storing the supported condition event separately from the source evidence or provenance that helped you choose its start date.

Where engineers usually get tripped up

The mistakes are predictable because the source data is messy in predictable ways:

  • Onset date vs diagnosis date
  • Onset date vs first coded encounter
  • Clinical onset vs established administrative onset
  • Patient-reported start vs evidence-supported start

A good ETL design handles those differences explicitly. Label each candidate date by meaning. Rank the candidates by trust for the use case. Keep the original source values queryable. If you use OMOPHub to document mapping decisions, this is the point where that discipline pays off, because your future self and your analysts can see why one date won and the others were kept as supporting evidence.

That is how you prevent a timeline problem from becoming an analytics problem.

Mapping Onset Dates in the OMOP CDM

A new ETL run lands on your desk with three plausible dates for the same condition. One came from a registry intake form, one from note extraction, and one from the first coded visit. If you load the wrong one into OMOP, every downstream time-to-event analysis starts from the wrong clock.

In the OMOP CDM, a condition onset usually maps to CONDITION_OCCURRENCE.condition_start_date, and to condition_start_datetime if the source supports time-level precision. The hard part is rarely the target column. The hard part is deciding which source date represents the start of the condition. If you need a quick refresher on how the model is organized, the OMOP Common Data Model overview is a useful reference.

A five-step infographic guide explaining the technical process of mapping patient onset dates into OMOP CDM.

Start with event semantics

Prioritize the event's meaning over the table structure.

A source date tied to the first known manifestation of a disease often belongs in condition_start_date. A source date that only captures when a patient first reported a symptom, without enough evidence to assert a condition, may fit better in OBSERVATION, or as supporting provenance linked to the chosen condition record.

That distinction matters because OMOP tables represent different kinds of facts. A condition row states that a condition event exists. A supporting observation records evidence about how you know it, when it was reported, or how certain that timing is. If you collapse those ideas into one date, your ETL becomes easy to load and hard to trust.

A practical pattern looks like this:

  1. Identify each source date candidate.
  2. Label each candidate by meaning.
  3. Rank the candidates by analytical trust.
  4. Map the selected date to the OMOP event record.
  5. Preserve the source and decision logic somewhere queryable.

A decision hierarchy that works

When several candidates exist, use a deterministic rule set. Data engineers need rules that produce the same answer every time, not a date selection process that changes with each source feed.

For example:

  • Highest confidence: Structured onset field tied to the condition.
  • Next: NLP-extracted onset from clinician documentation.
  • Then: Earliest strongly linked symptom narrative.
  • Lowest: Generic diagnosis or billing date used as fallback.

This hierarchy is not universal. It is, however, much safer than taking the minimum available date and hoping it reflects clinical reality.

A date without provenance becomes a debugging problem later.

Avoid confusing onset with observability

A common ETL mistake is confusing condition_start_date with observation_period_start_date.

These fields answer different questions. observation_period_start_date marks when your source can reliably observe the person. condition_start_date records when the condition began, or the best supported estimate your ETL can derive. A patient may enter your data source years after the condition started.

That situation is normal, especially in chronic disease registries, insurance enrollment feeds, and specialty clinics. Keep the earlier onset when the source supports it. Then let analysts address left truncation explicitly in study design, instead of rewriting the person's history to match the observation window.

Provenance should travel with the date

Onset logic is a chain of decisions. If one link is hidden, analysts cannot tell whether a date came from a structured clinical field, note NLP, a patient survey, or a registry abstraction workflow.

Store that provenance in a reproducible form. Good options include:

  • Observation records: Add a companion observation for source type or onset evidence.
  • ETL audit tables: Store source field, transformation rule, extraction method, and confidence.
  • Custom extension fields: Use controlled extensions when your platform supports them, and document them carefully.

Operational success or failure for OMOP projects often depends on this. Two sites can both populate condition_start_date and still mean different things by it. Clear provenance makes those differences visible during validation, federation, and network studies.

Example ETL logic

Here's a compact SQL pattern for selecting the best onset candidate from staged source data:

with ranked_onset as (
    select
        person_id,
        source_condition_code,
        candidate_date,
        candidate_type,
        case
            when candidate_type = 'structured_condition_onset' then 1
            when candidate_type = 'nlp_condition_onset' then 2
            when candidate_type = 'linked_symptom_onset' then 3
            when candidate_type = 'diagnosis_date_fallback' then 4
            else 9
        end as priority,
        row_number() over (
            partition by person_id, source_condition_code
            order by
                case
                    when candidate_type = 'structured_condition_onset' then 1
                    when candidate_type = 'nlp_condition_onset' then 2
                    when candidate_type = 'linked_symptom_onset' then 3
                    when candidate_type = 'diagnosis_date_fallback' then 4
                    else 9
                end,
                candidate_date
        ) as rn
    from staging_condition_onset_candidates
    where candidate_date is not null
)
select
    person_id,
    source_condition_code,
    candidate_date as chosen_condition_start_date,
    candidate_type as chosen_onset_provenance
from ranked_onset
where rn = 1;

This pattern works like a triage queue. Each candidate date gets a priority based on meaning, then row_number() picks the best-supported record per person and condition. The output remains explainable because the selected date and its provenance travel together.

For production ETL, extend this pattern with source-system identifiers, rule version, and a flag for dates that predate the observation period. That makes validation much easier in OMOPHub or any audit workflow you use to review temporal mapping decisions.

Use standard concepts carefully for onset-related elements

Some source systems carry onset as its own data element, separate from the condition record. In those cases, standardization still helps, especially if you need to preserve the source fact alongside the mapped OMOP event.

As noted earlier, standardized exchange frameworks define onset data elements such as illness or injury onset date and time. In OMOP ETL, the practical takeaway is simple. Preserve the original meaning of the source field, map the clinical event to the right domain table, and keep the source evidence available for review.

Best practices for production pipelines

  • Document date meaning first: Put the business definition beside the transformation rule.
  • Separate fallback logic from primary mapping: Analysts should be able to see when diagnosis date was substituted.
  • Keep raw and standardized timelines: Validation usually needs both.
  • Flag pre-observation onsets: Keep them, and mark them clearly.
  • Version your mapping rules: Temporal logic changes, and reproducibility depends on knowing when it changed.

A good onset mapping does more than populate a field. It gives future analysts, validators, and ETL maintainers a clear answer to one question: why did this date win?

Automating Vocabulary Mapping with OMOPHub

A new onset rule usually breaks in a familiar place. The source term looks obvious to a clinician, but your ETL still has to decide which standard concept, relationship path, and domain behavior belong in production code.

That tension shows up fast with phrases such as “symptom began,” “disease onset,” or “first noticed weakness.” It gets harder with progressive disorders, where the first symptom, the first clinical suspicion, and the recorded diagnosis may sit on different points in time. The Social Security Administration's POMS guidance on onset for ALS is a useful reminder that formal recognition can occur after earlier symptom evidence, which is exactly why vocabulary selection and temporal logic have to be reviewed together.

A hand pointing to a digital visualization of OMOP data transformation process with key healthcare concepts.

Manual vocabulary browsing works for one-off research. Production ETL needs a process you can rerun, audit, and explain six months later after the vocabulary has changed.

A useful companion read is mapping in ETL, especially if you're designing reusable crosswalk logic.

Interactive lookup first

Start with interactive lookup before you automate anything. It works like checking the legend before plotting coordinates on a map. You confirm the semantic family first, then you write code against approved concepts instead of against a guess.

For ad hoc exploration, use the OMOPHub Concept Lookup tool. It helps when you need to inspect candidate concepts before writing code.

For example, you might search for:

  • onset date
  • symptom onset
  • illness onset
  • amyotrophic lateral sclerosis
  • weakness
  • tremor

This quick review helps you catch a common ETL mistake. Engineers often grab a concept with the right words but the wrong role in the vocabulary, such as a finding, a procedure, or a metadata concept that does not belong in the event record they are building.

Python example

The Python SDK is available in the OMOPHub Python repository. A practical pattern is to search concepts first, then fetch relationships for a selected concept.

from omophub import OMOPHub

client = OMOPHub(api_key="YOUR_API_KEY")

results = client.concepts.search(query="onset date")
for concept in results.get("items", []):
    print(concept.get("concept_id"), concept.get("concept_name"), concept.get("vocabulary_id"))

If you're exploring a known concept such as ALS:

from omophub import OMOPHub

client = OMOPHub(api_key="YOUR_API_KEY")

concept = client.concepts.get(concept_id=56220002)
print(concept.get("concept_name"))

relationships = client.relationships.list(from_concept=56220002)
for rel in relationships.get("items", []):
    print(rel.get("relationship_name"), rel.get("to_concept_id"))

R example

The R SDK is available in the OMOPHub R repository.

library(omophub)

client <- omophub_client(api_key = Sys.getenv("OMOPHUB_API_KEY"))

results <- concepts_search(client, query = "onset date")
print(results)

API design tips

Once the concept review is done, automate the approved logic, not the exploration step. That division keeps your ETL predictable and keeps analysts from asking why yesterday's run chose a different concept for the same source term.

Use these habits in onset-focused pipelines:

  • Cache approved concepts: Don't search live for every row in an ETL batch.
  • Version concept sets: Vocabulary updates can change descendants and mappings.
  • Store source term plus chosen standard concept: You'll need both for QA.
  • Review relationship direction carefully: “Maps to” and hierarchical descendants aren't interchangeable.

Vocabulary automation works best when engineers separate exploration, approval, and production execution.

The goal of automation is repeatability, which also improves speed. Keep the search step interactive, promote approved concepts into versioned ETL assets, and use OMOPHub as the layer that makes those decisions easier to inspect and rerun.

Solving Common Onset Date ETL Challenges

Your ETL run finishes at 2:00 a.m. The row counts look fine. Then a reviewer asks why a patient's Parkinson's onset is loaded as the diagnosis date from claims when the neurology note says symptoms began 18 months earlier. That is the moment onset logic stops being a simple mapping task and becomes a timeline design problem.

Onset work fails in familiar ways. The source is vague. The timing is relative. Or the condition unfolds slowly enough that no single calendar day feels fully defensible. In OMOP, those edge cases matter because one chosen date can change incidence counts, time-to-treatment analyses, cohort entry, and any study that depends on temporal ordering.

Structured data alone will not solve this. The NLP literature cited in the clinical text onset extraction session describes frequent abstraction errors, missing onset in structured EHR data, and better outbreak detection when teams use onset-based signals instead of diagnosis dates alone. For a data engineer, the lesson is practical. Temporal interpretation needs explicit rules, versioned logic, and auditability.

A young man looking at a laptop screen displaying an infographic about ETL data onset challenges.

Relative dates in notes

Clinicians rarely write onset in database-ready form. They write, “pain began two years ago,” “worsening since last winter,” or “symptoms started before pregnancy.”

A relative date works like a coordinate that needs an origin. Without the origin, the value is incomplete. In clinical text, the origin is usually the note timestamp, encounter date, or a clearly stated life event.

If a note says “two years ago” and the note date is 2024-05-01, your ETL can resolve an approximate onset date. But that resolved date should carry its derivation with it. Treating an inferred date the same way as an explicit date is how silent bias enters an OMOP pipeline.

A practical pattern is to store:

  • the resolved date
  • the resolution method, such as relative_to_note_date
  • the precision level, such as exact, month-level, season-level, or estimated
  • the source text or source field identifier used for the derivation

That extra metadata is your flight recorder. When an analyst questions a surprising timeline, you can show how the date was built instead of re-reading notes by hand.

Gradual onset conditions

Progressive disorders rarely have a starting gun. They behave more like sunrise than a light switch. ALS, Parkinson's disease, dementia, and similar conditions often appear as scattered symptoms before anyone records a named diagnosis.

That creates a policy choice. You are not discovering a single universally true onset date. You are selecting a reproducible operational definition for a defined analytic purpose.

Common defensible approaches include:

  • Earliest evidence date: First documented symptom strongly linked to the condition.
  • Functional onset date: First documented impairment affecting daily activity or work.
  • Confirmed clinical onset date: First note where a clinician explicitly states onset timing.

Each definition answers a different question. Earliest evidence is useful for disease progression studies. Functional onset can matter more in disability or burden-of-illness work. Confirmed clinical onset may be the cleanest choice for conservative cohort design. Problems start when a pipeline mixes these definitions across source systems or across releases.

Conflicting source systems

Conflicting dates are normal. A registry may say symptoms began in March. An EHR note may say “started six months ago” in a July visit. Claims may first show the diagnosis in September.

The ETL should reconcile those candidates with a ranking policy that engineers and analysts can inspect. Hidden tie-breakers create mistrust, especially when downstream studies depend on event order.

A practical conflict strategy

  • Prefer condition-linked evidence over generic timing A date tied directly to the target condition usually deserves more weight than a generic complaint date.

  • Prefer explicit dates over inferred dates “Started on 2022-08-14” is stronger evidence than “about a year ago.”

  • Prefer clinician-documented context over billing timing Claims often reflect encounter and reimbursement timing rather than symptom onset.

  • Preserve alternates Keep secondary candidate dates in a staging or audit table so reviewers can trace what was considered and why it lost.

When dates conflict, your ETL should document the resolution logic instead of hiding the discrepancy.

A simple way to implement this is to score candidate dates before loading the final OMOP value. For example, explicit clinician documentation might score higher than a relative note phrase, which scores higher than first claims evidence. The exact ranking can vary by condition, but the method should stay stable and versioned.

Quality checks that catch real problems

Generic row counts will not catch temporal mistakes. Onset QA needs timeline-aware checks.

Run checks such as:

  • Future onset check: Flag dates after the source record date or ETL run date.
  • Pre-birth check: Catch impossible timelines.
  • Post-death check: Review condition starts after death unless your source logic clearly supports them.
  • Observation mismatch check: Flag onset dates before observation start so analysts understand possible left censoring.
  • Treatment-before-onset check: Review cases where first therapy predates the chosen onset.

These checks matter because onset errors often look valid in isolation. The date exists. The concept maps correctly. The row loads. The problem only appears when you compare one event to the rest of the person's timeline.

Documentation matters as much as code

A new data engineer should be able to read your onset logic the way a clinician reads an assessment plan. The reasoning needs to be visible.

Document, at minimum:

  • the business definition of onset used
  • the source fields considered
  • the ranking logic across competing sources
  • the fallback behavior when evidence is incomplete
  • the uncertainty or precision flags
  • the audit location for alternate candidate dates

If you use OMOPHub in the mapping workflow, keep the same discipline here that you use for vocabulary decisions. Explore first. Approve a policy. Then encode that policy into deterministic ETL steps. That is how onset logic becomes maintainable instead of mysterious.

Practical SQL Queries for Onset Analysis

Once you've loaded onset into OMOP consistently, you need to prove it behaves the way you expect. SQL is where a lot of onset mistakes become visible.

That matters in any timeline-sensitive workflow. In the disability context, onset precision has high stakes. The SSDI framework began in 1957, the 1984 Social Security Disability Reform Act standardized determination procedures, and in FY2022 8.9 million disabled workers received SSDI while insufficient evidence for onset date was cited in 35% of denials, according to SSA POMS historical and program context. The lesson for data engineers is simple: weak onset evidence changes outcomes.

Query one for onset to first treatment

This query measures the gap between condition onset and first drug exposure after onset.

with first_treatment as (
    select
        de.person_id,
        de.drug_concept_id,
        min(de.drug_exposure_start_date) as first_drug_date
    from drug_exposure de
    group by de.person_id, de.drug_concept_id
),
condition_and_treatment as (
    select
        co.person_id,
        co.condition_concept_id,
        co.condition_start_date,
        min(ft.first_drug_date) as first_treatment_date
    from condition_occurrence co
    left join first_treatment ft
        on co.person_id = ft.person_id
       and ft.first_drug_date >= co.condition_start_date
    group by co.person_id, co.condition_concept_id, co.condition_start_date
)
select
    person_id,
    condition_concept_id,
    condition_start_date,
    first_treatment_date,
    first_treatment_date - condition_start_date as days_to_treatment
from condition_and_treatment
where first_treatment_date is not null;

Use this to spot implausibly short or negative intervals. If you see many negative values in a condition where treatment should follow onset, your mapping probably used diagnosis timing inconsistently.

Query two for pre-observation onsets

This check finds condition starts that occur before the person's observation period.

select
    co.person_id,
    co.condition_concept_id,
    co.condition_start_date,
    op.observation_period_start_date
from condition_occurrence co
join observation_period op
    on co.person_id = op.person_id
where co.condition_start_date < op.observation_period_start_date;

This isn't automatically wrong. It often reflects historical onset recorded after the patient enters your system. The query helps analysts decide whether to censor, stratify, or flag those records.

Query three for duration-based cohorting

This example creates a simple chronic-condition cohort by selecting people whose onset precedes an index date by a minimum period.

select
    co.person_id,
    co.condition_concept_id,
    co.condition_start_date,
    de.drug_exposure_start_date as index_date
from condition_occurrence co
join drug_exposure de
    on co.person_id = de.person_id
where co.condition_start_date <= de.drug_exposure_start_date - 180;

The exact threshold should reflect your study design. The query pattern is what matters. You're using onset as a temporal qualifier, not just a descriptive field.

Query habits worth keeping

  • Comment your assumptions: Especially if diagnosis date was used as fallback upstream.
  • Test by condition family: Acute and progressive diseases behave differently.
  • Review null patterns: Missing onset isn't random in many datasets.

Mastering Temporal Data in Your Analytics

A strong onset strategy changes how you handle all clinical time data. You stop treating dates as interchangeable fields and start treating them as claims with context, source, and uncertainty.

That's the answer to what is an onset date. It's not just the first date you find. It's the date that best represents the beginning of a clinically or administratively meaningful state, according to the rules of your use case.

A working checklist

Question the context

Before you map anything, ask what the date means in the source system. Symptom start, diagnosis recognition, legal determination, and patient recall all belong to different semantic buckets.

Standardize the representation

Map onset into OMOP in a way that aligns with event semantics. Most often that means condition_start_date, but not always. Provenance and support records matter.

Automate the vocabulary work

Manual concept hunting doesn't scale. Use a repeatable concept and relationship workflow so your ETL remains auditable and easier to update.

Handle unstructured evidence deliberately

Clinical notes carry a lot of the onset signal. Relative dates, ambiguity, and gradual progression need explicit resolution rules, not ad hoc analyst fixes.

Validate with timelines

Run SQL checks that compare onset to observation windows, treatment starts, and impossible dates. A populated field isn't proof of a correct field.

Temporal quality isn't a polish step. It's part of data model integrity.

If you build ETL this way, your downstream analytics become easier to trust. Your cohorts get cleaner. Your treatment windows make more sense. Your AI models have a better chance of learning disease trajectories rather than documentation noise.

And when someone asks you what onset date should be used, you won't answer with a guess. You'll answer with a definition, a rule, and a reproducible implementation.


If you're building OMOP ETL pipelines and want faster access to standardized vocabularies, concept search, and relationship traversal without maintaining local ATHENA infrastructure, OMOPHub is worth a look. It's especially useful when you need to operationalize onset-related mappings, automate concept set authoring, and keep your temporal logic reproducible across teams.

Share: