Introductie
Tijdsaanduidingen zitten verweven in vrijwel elk bedrijfsproces: wanneer werd een bestelling geplaatst, wanneer staat een levering gepland, of hoe laat meldde een werknemer zich aan? In Odoo gebruik je het Datetime-veld om zulke tijdstippen met datum en uur vast te leggen en betrouwbaar te bewaren.
Waar een Date-veld enkel een kalenderdag bijhoudt, voegt het Datetime-veld het exacte tijdstip toe — uur, minuut en seconde. Dat lijkt misschien klein, maar het wordt cruciaal zodra je met verschillende tijdzones werkt of precies wilt weten wát er op welk moment gebeurde.
Deze gids geeft je een praktisch overzicht: wat het Datetime-veld precies opslaat, hoe Odoo er intern mee omgaat, hoe je het toevoegt via Studio, Python of API, en concrete voorbeelden uit echte bedrijfsworkflows.
Wat is het Datetime-veld in Odoo
Binnen het Odoo ORM is fields.Datetime bedoeld om een gecombineerde datum-tijdwaarde te bewaren (tot op de seconde). In de database correspondeert dit met een PostgreSQL TIMESTAMP-kolom. Odoo slaat zulke waarden altijd in UTC op en zet ze bij weergave om naar de tijdzone van de actieve gebruiker.
Voor gebruikers verschijnt een Datetime-veld als een gecombineerde datum-en-tijdkiezer in formulieren: een kalender voor de dag en een tijdveld voor uur en minuut. In lijsten en rapporten wordt de weergave aangepast aan de taal- en tijdzone-instellingen van de gebruiker.
Zo ziet een Datetime-definitie in een Python-model er globaal uit:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_confirmed_on = fields.Datetime(
string='Confirmed On',
default=fields.Datetime.now,
readonly=True,
copy=False,
)
De parameter string bepaalt het label dat gebruikers zien. default vult het veld automatisch bij het aanmaken van een record. readonly
In Odoo Studio heet dit veldtype Date & Time. Velden die via Studio gemaakt worden krijgen automatisch een x_studio_-voorvoegsel. Maak je het veld via code of de API, dan kies je zelf de technische naam.
Hoe het veld werkt
Wanneer je een Datetime-veld definieert, maakt Odoo tijdens installatie of upgrade de bijbehorende databasekolom aan. Je hoeft geen handmatige SQL-migraties te schrijven; het framework neemt die stap voor zijn rekening.
Een verrassend punt voor veel gebruikers is hoe Odoo met tijdzones omgaat: waarden worden intern in UTC opgeslagen. Als iemand in Brussel een afspraak op 15:00 zet, wordt dat als 13:00 UTC opgeslagen. Een gebruiker in New York ziet diezelfde afspraak als 09:00. Odoo verzorgt deze conversie automatisch op basis van de tijdzone in ieders profiel.
Belangrijkste veldkenmerken
Dit zijn de belangrijkste eigenschappen van een Datetime-veld binnen Odoo:
- default: Vaak ingesteld als
fields.Datetime.nowom bij het aanmaken automatisch het huidige UTC-tijdstip te gebruiken. - required: Maakt het veld verplicht in formulieren en op modelniveau.
- readonly: Blokkeert handmatige wijzigingen in de interface. Handig voor automatisch gegenereerde tijdstempels.
- compute: Koppelt een Python-methode die de waarde afleidt uit andere velden of logica.
- store: In combinatie met
computezorgt dit dat de berekende waarde in de database wordt opgeslagen voor zoek- en rapportagedoeleinden. - copy: Bepaalt of de waarde wordt gekopieerd bij dupliceren van records. Standaard
True; zet opFalsevoor tijdstempels die niet mogen doorsijpelen. - index: Maakt een database-index. Handig voor veelgebruikte filtervelden zoals geplande datums op grote tabellen.
Weergave in views
In formulieren krijg je een gecombineerde datum- en tijdkiezer: een kalender en een tijdveld in één. In lijstweergaven zie je een geformatteerde datum-tijdstring volgens de taalinstelling. In zoekfilters kun je vaak zoeken op periodes: vóór, na of tussen twee datums.
Je kunt het Datetime-veld ook combineren met het date_range-widget om in één keer een tijdsvenster te selecteren — handig bij planningen of taken met een start- en eindperiode.
Datetime vs Date: welke kiezen?
De vuistregel is simpel: gebruik fields.Date als alleen de kalenderdag telt, en fields.Datetime wanneer het précieze uur en minuut relevant zijn.
Gebruik Date voor zaken als: vervaldatums van facturen, geboortedata, houdbaarheidsdata van producten, en contractverlengingen.
Gebruik Datetime voor zaken als: bevestigingstijdstippen van bestellingen, starttijd van afspraken, in- en uitkloktijden van personeel, en geplande magazijnoperaties.
Onnodig Datetime gebruiken voegt alleen maar tijdzonecomplexiteit toe zonder voordeel. Vraag jezelf altijd af of het uur echt relevant is voor de bedrijfsprocesmodellering.
Praktische bedrijfsvoorbeelden
Het Datetime-veld komt in bijna elk Odoo-module voor. Hieronder vijf concrete use-cases uit de praktijk.
CRM: opvolging van leads
In CRM leggen native Datetime-velden vast wanneer acties gebeurden: wanneer een lead werd geopend, wanneer een opvolging gepland is, enz. Salesmanagers gebruiken die gegevens om reactietijden te meten, stilstaande kansen op te sporen en teamactiviteiten te rapporteren. Extra custom Datetime-velden zijn handig om bijvoorbeeld het tijdstip van een verzonden offerte of een telefoongesprek te loggen.
Verkoop: orderbevestigingstijdstippen
Het date_order-veld op sale.order is een Datetime-veld dat het exacte moment van orderbevestiging vastlegt. Dat is essentieel voor uren- of dagrapporten, doorlooptijdanalyse en audits wanneer na bevestiging aanpassingen nodig blijken.
Magazijn: geplande transportmomenten
Het scheduled_date-veld op stock.picking helpt magazijnteams plannen wanneer ontvangst of verzending moet plaatsvinden. Workflows en automatiseringen kunnen acties triggeren op basis van hoe deze datum zich verhoudt tot het huidige tijdstip — bijvoorbeeld een notificatie bij een vertraagde levering.
Productie: start- en eindtijd productie
In productieorders worden start- en eindtijden vastgelegd met Datetime-velden. Die gegevens voeden capaciteitsplanning, efficiëntierapporten en analyses per shift of operator. Voor bedrijven met meerdere ploegen is die precisie cruciaal om prestatieverschillen over de dag te herkennen.
HR: aanwezigheids- en verlofbeheer
HR Attendance slaat check-in en check-out vast met Datetime-velden; verlofaanvragen gebruiken Datetime om begin- en eindmoment exact te definiëren. Loonberekeningen en overurentoeslagen hangen vaak van deze nauwkeurigheid af — verkeerde of ontbrekende timestamps beïnvloeden salarisdirect.
Een Datetime-veld maken of aanpassen
Drie manieren om een Datetime-veld toe te voegen, afhankelijk van je technische voorkeur en omgeving.
Odoo Studio (zonder code)
Odoo Studio laat businessgebruikers velden toevoegen zonder te programmeren. Zo voeg je een Datetime-veld toe:
- Open Odoo Studio via het hoofdmenu.
- Ga naar het formulier waar het veld moet verschijnen.
- Sleep een Date & Time-veld vanuit de zijbalk naar het formulier.
- Stel label, verplichte status en eventueel een default in via het eigenschappenpaneel.
- Bewaar en sluit Studio.
Studio maakt het veld automatisch aan met een x_studio_-voorvoegsel en voegt het aan de view toe. Geen handmatige databasemigratie nodig — Odoo regelt dat bij opslag. Dit is de aanbevolen route voor gebruikers die snel een tijdstempel aan een bestaand formulier willen toevoegen.
Via Python in een custom module
Ontwikkelaars definiëren Datetime-velden in Python-modelbestanden — de juiste aanpak voor versiebeheer en uitrol naar meerdere omgevingen:
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_last_contact_date = fields.Datetime(
string='Last Contact Date',
default=fields.Datetime.now,
copy=False,
)
Na de modeldefinitie voeg je het veld toe in de view-XML zodat het zichtbaar wordt in de interface. Odoo maakt de TIMESTAMP-kolom automatisch aan bij installatie of upgrade van de module; handmatige SQL is niet nodig.
Via de XML-RPC API
Als je configuraties geautomatiseerd uitrolt of velden op afstand beheert, kun je Datetime-velden ook via XML-RPC aanmaken:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_last_contact_date',
'field_description': 'Last Contact Date',
'model_id': model_id,
'ttype': 'datetime',
'state': 'manual',
}]
)
De ttype: datetime vertelt Odoo dat het om een Datetime-veld gaat. state: manual geeft aan dat het veld buiten een module-setup is aangemaakt — de juiste instelling voor via Studio of API aangemaakte velden.
Beste werkwijzen
1. Gebruik fields.Datetime.now als functie, niet als aanroep
Voor defaults gebruik je default=fields.Datetime.now zonder haakjes. Haakjes geven één vaste tijd bij het laden van de klasse, waardoor alle later aangemaakte records hetzelfde, verouderde tijdstempel krijgen. Geef de functie door zodat Odoo bij elke recordcreatie het actuele tijdstip berekent.
2. Zet copy=False op gebeurtenis-tijdstempels
Velden die een specifiek moment vastleggen (bevestiging, voltooiing, enz.) moeten copy=False krijgen. Bij dupliceren mogen zulke tijdstempels niet worden overgenomen; anders raakt je historische data vervuild en audits worden onbetrouwbaar.
3. Schrijf altijd in UTC via de API
Wanneer je via XML-RPC schrijft, geef datums en tijden door als UTC in het formaat YYYY-MM-DD HH:MM:SS. De API voert geen tijdzoneconversie uit bij schrijven; wat je doorgeeft wordt als UTC opgeslagen. Lokale tijden zonder conversie leiden tot verborgen fouten die later lastig op te sporen zijn.
4. Gebruik readonly voor automatisch gegenereerde timestamps
Automatisch vastgelegde tijdstempels moeten doorgaans readonly zijn in de UI zodat gebruikers ze niet per ongeluk aanpassen. Als wijziging noodzakelijk is, regel die toegang via veldbeveiliging en rechten, niet door het veld standaard bewerkbaar te maken.
5. Kies Date als tijd niet relevant is
Is alleen de dag van belang (deadline, vervaldatum, verjaardag)? Gebruik dan fields.Date. Datetime voegt onnodige tijdzonecomplexiteit toe en maakt het model zwaarder dan nodig.
Veelvoorkomende valkuilen
Tijdzoneverwarring bij ruwe database-waarden
De grootste verwarring ontstaat wanneer mensen ruwe waarden uit de database of API halen: die zijn in UTC, niet in lokale tijd. Integraties of rapporten die op die onbewerkte output vertrouwen krijgen vaak urenfouten. Converteer tijdzones expliciet aan de clientzijde voordat je resultaten naar eindgebruikers toont.
Lokale tijden schrijven via de API
Als je een lokale tijd naar de API stuurt zonder conversie, zal de database die interpreteren als UTC. Een afspraak die je als '2026-01-01 15:00:00' in Parijs bedoelt, wordt dan mogelijk verkeerd weergegeven afhankelijk van zomer-/wintertijd. Zulke fouten duiken meestal pas in productie op wanneer echte gebruikers in verschillende tijdzones gaan werken.
default=fields.Datetime.now() met haakjes gebruiken
Haakjes toevoegen is een sluipend probleem: fields.Datetime.now() wordt één keer geëvalueerd bij het laden van de klasse. Alle records die daarna worden aangemaakt krijgen datzelfde, vastgezette tijdstempel, wat rapportages en analyses kapot maakt. Omdat er wel een tijdstempel staat, is het probleem evenwel moeilijk te detecteren.
Copy=False vergeten op evenement-tijdstempels
Zonder copy=False worden tijdstempels van het origineel overgenomen bij duplicatie. Bevestigingsdata, creatietijden of productiestartmomenten zouden niet op een gekopieerd record moeten blijven staan; anders vervuil je historische gegevens en auditsporen.
Datetime gebruiken wanneer Date volstaat
Het gebruik van Datetime voor iets als een factuurvervaldatum voegt alleen maar ruis toe: onnodige tijdvelden voor gebruikers, onnodige tijdzoneconversies en een complexere interface. Houd het veldtype zo eenvoudig mogelijk en passend bij de businessvraag.
Samenvatting
Het Datetime-veld is een van de meest waardevolle types in Odoo zodra precisie telt. Of je nu wil weten wanneer een lead geopend werd, productie begon of een medewerker incheckte — Datetime komt overal terug.
Het belangrijkste concept om te onthouden is het UTC-opslagmodel: alles in de database staat in UTC. De interface toont automatisch de tijd volgens de gebruiker, maar bij externe lees- en schrijfacties via de API moet je dit expliciet meewegen. De meeste timezone-bugs in integraties vallen terug te voeren op deze misvatting.
Verder: gebruik de juiste default-syntaxis, zet copy=False waar nodig en kies Date als tijd irrelevant is — dat houdt je datamodel zuiver en je rapporten betrouwbaar.
Bij Dasolo helpen we bedrijven Odoo te implementeren, te customizen en te optimaliseren over afdelingen heen. Of het nu gaat om datamodelontwerp, veldaanpassingen of het ontwikkelen van een volledige module, wij ondersteunen je graag. Neem contact met ons op en laten we jouw Odoo-project bespreken.