Einführung
Wenn Sie schon einmal eine Verkaufsbestellung, eine Projektaufgabe oder einen Fertigungsauftrag in Odoo geöffnet haben, sind Sie dem Datumsfeld begegnet. Liefertermine, Fälligkeitsdaten von Rechnungen, Beginn- und Enddaten von Verträgen – zeitbezogene Informationen werden in Odoo meist mit genau diesem Feldtyp verwaltet.
Für Anwender ist das Datumsfeld banal: anklicken, Kalender wählen, fertig. Hinter den Kulissen steckt aber mehr: das Datumsfeld verhält sich anders als ein Zeitstempel. Wer weiß, wie es im Odoo-Datenmodell arbeitet, wann man Date statt DateTime einsetzen sollte und wie man es richtig anlegt, verhindert unnötige Probleme mit Zeitzonen, Automatisierungen und Berichten.
Dieser Leitfaden erklärt kompakt und praxisnah, worauf es beim Datumsfeld in Odoo ankommt: was es speichert, wie es in Ansichten wirkt und wie Sie es sinnvoll in Geschäftsprozesse einbinden.
Was genau ist das Datumsfeld in Odoo?
Im Odoo-ORM ist das Datumsfeld (fields.Date) dafür gedacht, rein das Kalenderdatum zu speichern – also Jahr, Monat und Tag, ohne Stunden oder Minuten. Ein Eintrag wie "2026-03-06" enthält keinerlei Uhrzeitinformationen.
Auf Datenbankebene wird das Datumsfeld in PostgreSQL als DATE-Spalte abgelegt, wohingegen DateTime als TIMESTAMP gespeichert wird und damit Zeitangaben bis auf Sekundenebene unterstützt.
In der Benutzeroberfläche zeigt sich das Datumsfeld als Eingabefeld mit einem Kalender-Picker: Anwender können tippen oder ein Datum auswählen. In Listen wird das Datum formatiert nach den Spracheinstellungen des Benutzers dargestellt.
So sieht eine typische Definition eines Datumsfelds in einem Modul aus:
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
x_deadline_confirmed = fields.Date(
string='Confirmed Deadline',
help='The officially confirmed deadline agreed with the customer.',
)
In Odoo Studio heißt das Element einfach "Date". Felder, die per Studio angelegt werden, bekommen automatisch das Präfix x_studio_. Legen Sie das Feld hingegen per Python-Code oder über die API an, vergeben Sie selbst einen technischen Namen.
Wie das Feld technisch funktioniert
Date vs. DateTime – worin liegt der Unterschied?
Das Entscheidende beim Datumsfeld ist, was fehlt: jede Uhrzeit. Es gibt keine Stunden, keine Konvertierungen, nur das reine Kalenderdatum.
DateTime hingegen speichert einen kompletten Zeitstempel in UTC und wird beim Anzeigen in die lokale Zeitzone des Benutzers umgerechnet. Genau hier entstehen oft die berühmten "mein Datum ist um einen Tag verschoben"-Probleme – das ist ein DateTime-Phänomen, nicht das Datumsfeld.
Bei einem Date-Feld entspricht der gespeicherte Wert exakt dem, was alle Nutzer sehen. Ein Eintrag 2026-03-15 ist für jeden Anwender 2026-03-15, egal in welcher Zeitzone er arbeitet.
Wichtige Attributen des Feldes
Die folgenden Optionen sind die wichtigsten Konfigurationsmöglichkeiten für ein Datumsfeld in Odoo:
- required: macht das Feld verpflichtend in UI und Modell.
- default: legt einen automatischen Standardwert fest; z. B.
fields.Date.todayfür das aktuelle Datum. - index: erzeugt einen Datenbankindex, sinnvoll für Filter und Berichte.
- compute: verbindet das Feld mit einer Python-Funktion, die den Wert berechnet.
- store: zusammen mit
computesorgtstore=Truedafür, dass das berechnete Ergebnis in der DB gespeichert wird. - readonly: verhindert die direkte Bearbeitung im Formular.
- copy: steuert, ob der Wert beim Duplizieren übernommen wird (Standard:
True).
Darstellung in Ansichten
Im Formular öffnet sich ein Kalender-Picker, in Listen wird das Datum formatiert angezeigt. Die Suchansicht bietet vordefinierte Bereiche wie "diese Woche", "diesen Monat" oder Vergleichsoperatoren wie vor/nach/ein Datum.
Das Anzeigeformat folgt den Spracheinstellungen des Benutzers (z. B. DD/MM/YYYY in Europa). Intern liegt das Datum aber immer im ISO-Format (YYYY-MM-DD) vor.
Wie das ORM mit Date-Feldern umgeht
Beim Lesen liefert das Odoo-ORM ein Python datetime.date-Objekt oder False, wenn leer. Beim Schreiben akzeptiert das ORM entweder ein datetime.date-Objekt oder einen String im Format "YYYY-MM-DD". Bei XML-RPC werden Datumswerte üblicherweise als Strings übertragen.
Es gibt keine komplizierten Umwandlungen: Odoo kümmert sich um Speicherung und Darstellung, weshalb Date-Felder im Alltag sehr zuverlässig sind.
Praxisbeispiele aus Unternehmen
Wo Datumsfelder typischerweise eingesetzt werden – fünf konkrete Beispiele
CRM: Vertragsbeginn und -ende
Im Vertrieb sind Verträge oft zeitlich begrenzt. Ein Datumsfeld auf Leads oder Vertragsmodellen dokumentiert Start- und Endtermine und macht Laufzeiten transparent.
Kombiniert mit automatischen Aktionen lassen sich Erinnerungen oder Statuswechsel auslösen, wenn ein Vertrag dem Ende entgegengeht – so entgehen Ihnen weniger verpasste Verlängerungen.
Vertrieb: vom Kunden gewünschte Liefertermine
Kunden geben häufig ein konkretes Lieferdatum an. Ein "vom Kunden gewünschtes Datum" auf Verkaufsbestellungen gibt der Operative-Abteilung eine klare Planungsbasis.
Ein Datumsfeld statt DateTime sorgt hier für Klarheit: keine Zeitzonenkonversionen, keine Missverständnisse zwischen Vertrieb und Lager.
Lager: Verfallsdaten für Chargen
In Branchen wie Lebensmittel oder Pharma sind Verfalls- und Mindesthaltbarkeitsdaten wichtig. Odoo speichert solche Daten auf stock.lot mit Date-Feldern.
Diese Daten steuern FEFO-Strategien und automatische Warnungen bei nahendem Ablauf – wichtig für Reklamationsschutz und Compliance.
Buchhaltung: Fälligkeitsdaten von Rechnungen
Fälligkeiten sind Datumsfelder und bestimmen Mahnläufe, die Identifikation überfälliger Rechnungen und die Erstellung der Altersanalysen (Aging).
Ein falsch gesetztes Fälligkeitsdatum kann Zahlungsläufe und Liquiditätsplanung stören – deshalb ist hier die richtige Feldwahl besonders kritisch.
HR: Einstellungen, Vertrags- und Zertifizierungsdaten
Für HR sind Einstellungsdaten, Ende der Probezeit, Vertragslaufzeiten und Zertifikat-Ablaufdaten typische Date-Felder. Sie treiben Erinnerungen, E-Mail-Benachrichtigungen und Lohnberechnungen an.
Eine saubere Personalverwaltung in Odoo basiert auf verlässlichen Datumsangaben in Mitarbeiterakten – diese Felder sind oft Auslöser für geschäftskritische Automatisierungen.
Datumsfelder anlegen oder anpassen
Es gibt drei gängige Wege, ein Datumsfeld in Odoo hinzuzufügen, je nach technischem Setup und Governance-Anforderungen.
Per Odoo Studio (No-Code)
Studio bietet den schnellsten Weg, ohne Code ein Datumsfeld zu ergänzen. Ideal für Consultants und Fachanwender, die Standardformulare erweitern wollen:
- Odoo Studio im Hauptmenü öffnen.
- Zum gewünschten Formular navigieren.
- Ein Datumsfeld aus der Seitenleiste in das Formular ziehen.
- Beschriftung, Pflichtfeld-Status und optionalen Standardwert festlegen.
- Studio speichern und schließen.
Studio legt das Feld mit dem Präfix x_studio_ an und fügt es sofort der Ansicht hinzu – es ist keine manuelle Datenbankmigration nötig.
Per Python in einem Custom-Modul
Für Entwickler und projektreife Anpassungen erfolgt die Definition in Python-Modellen. Diese Methode ist Versionierbar und für produktive Deployments empfohlen:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_customer_requested_date = fields.Date(
string='Customer Requested Date',
index=True,
copy=False,
help='Delivery date requested by the customer at time of order.',
)
Nach dem Ergänzen im Modell müssen Sie das Feld zusätzlich in der passenden View-XML aufnehmen. Beim Installieren oder Aktualisieren des Moduls erstellt Odoo automatisch die dazugehörige Datenbankspalte.
Per XML-RPC API
Für automatisierte Setups oder Remote-Konfigurationen können Felder auch programmatisch über XML-RPC erzeugt werden:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_customer_requested_date',
'field_description': 'Customer Requested Date',
'model_id': model_id,
'ttype': 'date',
'state': 'manual',
}]
)
Wichtig: für Datumsfelder lautet ttype 'date' (bei Zeitstempeln 'datetime'). Der Zustand 'manual' signalisiert, dass das Feld nicht per Modul installiert wurde, sondern manuell angelegt wurde.
Empfehlungen für den täglichen Einsatz
1. Date statt DateTime wählen, wenn die Uhrzeit keine Rolle spielt
Wenn nur das Datum zählt – Fristen, Geburtstag, Ablaufdatum – dann nutzen Sie fields.Date. DateTime bringt unnötige Zeitzonenkomplexität und kann zu Off-by-one-Fehlern führen.
2. Sinnvolle Default-Werte setzen
Für Felder wie "erwartetes Lieferdatum" lohnt es, einen Standard auf heute oder heute+X Tage zu setzen. Verwenden Sie default=fields.Date.today (ohne Klammern), damit der Default bei jeder Neuerstellung aktuell berechnet wird.
3. Indexieren, wenn das Feld oft gefiltert wird
Wenn Anwender regelmäßig nach einem Datum filtern (überfällige Rechnungen, kommende Verlängerungen), aktivieren Sie index=True. Auf großen Tabellen verbessert ein Index Abfragezeiten deutlich und kostet wenig bei der Anlage.
4. copy=False für Felder, die beim Duplizieren nicht übernommen werden sollen
Start- oder Ablaufdaten sollten beim Duplizieren nicht automatisch übernommen werden. Setzen Sie copy=False, damit die Anwender das Datum bewusst neu setzen und veraltete Daten nicht unbemerkt weitergetragen werden.
5. Constraints bei Datumsbereichen einbauen
Bei Paaren wie "Startdatum" und "Enddatum" ist ein Python-Constraint (@api.constrains) Pflicht, um sicherzustellen, dass das Enddatum nicht vor dem Start liegt. Das verhindert später schwer zu findende Inkonsistenzen.
Häufige Fehlerquellen
Verwechslung von Date und DateTime
Die häufigste Fehlerquelle: DateTime statt Date verwenden. DateTime wird in UTC gespeichert und bei der Anzeige angepasst; Date speichert nur das Kalenderdatum. Wer DateTime wählt, obwohl nur das Datum relevant ist, riskiert Darstellungsverschiebungen zwischen Zeitzonen.
Nutzen Sie immer die einfachste passende Feldart.
Server-Zeitzone bei geplanten Aktionen nicht berücksichtigen
Achten Sie bei geplanten Aktionen oder Berichten, die relative Filter wie "heute" nutzen, auf die Server-Zeit. fields.Date.today() gibt das Server-Datum (UTC) zurück. Bei verteilten Teams kann das zu ein-tägigen Abweichungen führen – testen Sie Automatisierungen aus mehreren Zeitzonen.
Fehlende Validierung bei Datumsbereichen
Häufig fehlen Prüfungen, die verhindern, dass ein Enddatum vor dem Startdatum liegt. Solche Inkonsistenzen brechen Dauerberechnungen und Filter. Setzen Sie daher immer eine entsprechende Constraint-Logik ein.
Index vergessen für häufig gefilterte Datumsfelder
Datumsfelder, die in Abfragen wie "Datum < heute" auftauchen, sollten indiziert sein. Ohne Index wird die Datenbank oft zu einer Full-Table-Scan gezwungen, was bei großen Modellen die Performance merklich verschlechtert.
Daten als Char-Feld speichern
Manche Teams speichern Daten als Text, um ein bestimmtes Format zu behalten. Das zerstört Sortierung, Filter und Datumsarithmetik. Verwenden Sie immer fields.Date – Odoo und PostgreSQL übernehmen Formatierung und Lokalisierung.
FAQ
Worin besteht der Unterschied zwischen Date und DateTime in Odoo?
Ein Date-Feld speichert nur das Kalenderdatum (Jahr/Monat/Tag). Ein DateTime-Feld speichert zusätzlich Stunden/Minuten/Sekunden, wird in UTC abgelegt und bei Anzeige in die lokale Zeitzone des Benutzers umgerechnet. Verwenden Sie Date, wenn die Tagesgenauigkeit ausreicht; nutzen Sie DateTime, wenn der genaue Zeitpunkt relevant ist.
Wie setze ich Standard auf das heutige Datum?
In Python verwenden Sie default=fields.Date.today ohne Klammern, damit Odoo das Datum bei jeder Neuerstellung neu bestimmt. In Odoo Studio wählen Sie in den Feldeigenschaften "Today" als Default aus.
Kann ein Datumsfeld berechnet werden?
Ja. Definieren Sie compute='_compute_my_date' und implementieren Sie eine Methode mit @api.depends(...) für die auslösenden Felder. Für Datumsberechnungen verwenden Sie Python datetime.date und timedelta. Mit store=True wird das Ergebnis in der DB abgelegt und ist damit filter- und gruppierbar.
Wie filtere ich Datensätze nach einem Datumsbereich in einer Domain?
Verwenden Sie Vergleichsoperatoren in der Domain. Beispiel: alle Einträge im März 2026 finden Sie mit:
[
('x_date_field', '>=', '2026-03-01'),
('x_date_field', '<=', '2026-03-31')
]
Datumangaben in Domains sollten immer im ISO-Format YYYY-MM-DD stehen.
Kann ein Datumsfeld nur unter bestimmten Bedingungen verpflichtend sein?
Rein visuell lässt sich das per attrs in der View regeln; echte Backend-Validierung benötigt Python-Logik, etwa ein @api.constrains. Für einfache Fälle bieten Odoo Studio und View-Attribute jedoch eine praktische No-Code-Alternative.
Fazit
Zusammengefasst: Das Datumsfeld ist eines der praktischsten Feldtypen in Odoo. Es ist leicht zu verstehen, zuverlässig in der Nutzung und treibt wichtige Geschäftslogiken wie Erinnerungen, Überfälligkeiten und zeitbasierte Berichte.
Wesentliche Erkenntnisse: Verwenden Sie Date statt DateTime, wenn nur das Datum relevant ist; setzen Sie sinnvolle Defaults und Indizes für Performance; und fügen Sie Constraints ein, wenn zwei Felder eine Datumsrange bilden.
Gute Datenmodelle in Odoo entstehen durch viele kleine, richtige Entscheidungen – und die Auswahl des passenden Feldtyps gehört ganz oben auf die Liste. Ein korrekt eingesetztes Datumsfeld ist ein kleiner, aber zentraler Baustein einer stabilen Odoo-Implementierung.
Bei Dasolo unterstützen wir Unternehmen dabei, Odoo in allen Abteilungen optimal einzusetzen: vom sauberen Datenmodell über individuelle Felder und Workflows bis hin zur vollständigen Modulentwicklung. Kontaktieren Sie uns und lassen Sie uns über Ihr Odoo-Projekt sprechen.