Skip to Content

Πεδίο Datetime στο Odoo: Ο Απόλυτος Οδηγός

Ολοκληρωμένος οδηγός για το πεδίο Datetime στο μοντέλο δεδομένων του Odoo — πώς αποθηκεύονται χρονικές στιγμές, πώς διαχειρίζεσαι ζώνες ώρας και πρακτικές εφαρμογές στην επιχείρηση
6 Μαρτίου 2026 από
Πεδίο Datetime στο Odoo: Ο Απόλυτος Οδηγός
Dasolo
| No comments yet

Εισαγωγή


Οι ημερομηνίες και οι χρονικές στιγμές συνοδεύουν σχεδόν κάθε δραστηριότητα μιας επιχείρησης: πότε μπήκε μία παραγγελία, πότε έχει προγραμματιστεί η παράδοση, πότε έκανε είσοδο ένας εργαζόμενος. Στο Odoo, το πεδίο Datetime είναι το στάνταρ μέσο για την καταγραφή αυτών των πληροφοριών με ακρίβεια ημερομηνίας και ώρας.


Σε αντίθεση με ένα απλό Date που αποθηκεύει μόνο την ημερομηνία, το Datetime περιλαμβάνει και την ώρα — μέχρι λεπτό και δευτερόλεπτο. Αυτή η διαφορά αποκτά κρίσιμη σημασία όταν εργάζεστε με χρήστες σε διαφορετικές ζώνες ώρας ή όταν χρειάζεστε ακριβή χρονικά σημεία για μετρήσεις και αναφορές.


Ο οδηγός αυτός περιλαμβάνει τα βασικά για το Datetime στο Odoo: τι αποθηκεύει, πώς συμπεριφέρεται στο μοντέλο δεδομένων, πώς να το δημιουργήσετε είτε μέσω Studio είτε με κώδικα Python, και πρακτικά παραδείγματα από καθημερινές επιχειρηματικές ροές.

Τι είναι το πεδίο Datetime στο Odoo


Στο ORM του Odoo, το πεδίο δηλώνεται μέσω fields.Datetime και αποθηκεύει ένα ενιαίο χρονικό σημείο με ακρίβεια δευτερολέπτου. Στη βάση δεδομένων αντιστοιχίζεται σε στήλη TIMESTAMP στη PostgreSQL. Εσωτερικά το Odoo κρατά τις τιμές σε UTC και τις προσαρμόζει στην τοπική ζώνη ώρας κάθε χρήστη όταν εμφανίζονται στο περιβάλλον εργασίας.


Για τον χρήστη, το Datetime εμφανίζεται ως συνδυασμένο επιλογέα ημερομηνίας και ώρας μέσα στις φόρμες — ένα ημερολόγιο με πεδίο ώρας. Σε λίστες και εκτυπώσεις, η μορφοποίηση ακολουθεί τις ρυθμίσεις γλώσσας και ζώνης ώρας του ενεργού χρήστη.


Παρακάτω βλέπετε το πώς δηλώνεται συνήθως ένα πεδίο Datetime σε ένα αρχείο μοντέλου Python:

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,
    )

Το όρισμα string καθορίζει την ετικέτα που βλέπει ο χρήστης. Το default ορίζει την προεπιλεγμένη τιμή —συνήθως το τρέχον χρονικό στιγμιότυπο— ενώ το readonly εμποδίζει την χειροκίνητη επεξεργασία, ιδανικό για χρονικά σημάδια ελέγχου (audit timestamps).


Στο Odoo Studio το πεδίο εμφανίζεται ως «Date & Time». Όταν το προσθέσετε μέσω Studio, παίρνει αυτόματα όνομα που ξεκινά με x_studio_. Αν το δημιουργήσετε με κώδικα ή μέσω API, ορίζετε εσείς το τεχνικό όνομα.

Πώς λειτουργεί το πεδίο


Κατά την εγκατάσταση ή αναβάθμιση ενός module, το Odoo φροντίζει να δημιουργήσει τη σχετική στήλη στη βάση δεδομένων — δεν χρειάζεται να γράψετε χειροκίνητες SQL μεταναστεύσεις.


Ένα συνηθισμένο σημείο σύγχυσης είναι ο χειρισμός ζωνών ώρας. Η βάση αποθηκεύει πάντα UTC. Αν ένας χρήστης στο Παρίσι ορίσει ένα ραντεβού για τις 15:00, το Odoo θα γράψει 13:00 UTC στη βάση. Ένας χρήστης στη Νέα Υόρκη θα δει την εγγραφή ως 09:00 — η μετατροπή γίνεται αυτόματα από το ORM βάσει της ζώνης ώρας που έχει ορίσει κάθε χρήστης.


Βασικά χαρακτηριστικά του πεδίου

Ακολουθούν οι σημαντικότερες ιδιότητες που μπορείτε να χρησιμοποιήσετε με ένα Datetime στο Odoo:

  • default: Συνήθως ορίζεται ως fields.Datetime.now για αυτόματη συμπλήρωση με το τρέχον UTC στιγμιότυπο κατά τη δημιουργία εγγραφής.
  • required: Κάνει το πεδίο υποχρεωτικό στην φόρμα και στο επίπεδο του μοντέλου.
  • readonly: Αποτρέπει την επεξεργασία στο περιβάλλον χρήστη — χρήσιμο για χρονικά σήματα που παράγονται αυτόματα.
  • compute: Συνδέει μέθοδο Python που υπολογίζει δυναμικά την τιμή από άλλα πεδία ή επιχειρησιακή λογική.
  • store: Σε συνδυασμό με compute, αποθηκεύει το υπολογισμένο αποτέλεσμα στη βάση ώστε να είναι διαθέσιμο σε αναζητήσεις και αναφορές.
  • copy: Ελέγχει αν η τιμή αντιγράφεται όταν διπλασιάζεται μια εγγραφή. Από προεπιλογή True — βάλτε False για χρονοσήματα που δεν πρέπει να μεταφέρονται.
  • index: Δημιουργεί ευρετήριο στη βάση. Χρήσιμο σε μεγάλα τραπέζια για πεδία που χρησιμοποιούνται συχνά σε φίλτρα, όπως προγραμματισμένες ημερομηνίες.

Πώς εμφανίζεται στις προβολές

Σε φόρμες, το Datetime εμφανίζεται ως ένα ενιαίο πεδίο με ημερολόγιο και επιλογή ώρας. Σε λίστες, εμφανίζεται μορφοποιημένο ανάλογα με τη γλώσσα χρήστη. Στις αναζητήσεις υποστηρίζονται φίλτρα εύρους — πριν/μετά/μεταξύ συγκεκριμένης περιόδου.


Μπορείτε επίσης να χρησιμοποιήσετε το widget date_range για να εμφανίσετε απευθείας επιλογή χρονικού διαστήματος μέσα στη φόρμα — πολύ χρήσιμο για παράθυρα προγραμματισμού και εργασίες με χρονικούς περιορισμούς.


Datetime ή Date: πώς να επιλέξετε

Ο κανόνας είναι απλός: προτιμήστε fields.Date όταν η ώρα δεν έχει σημασία και fields.Datetime όταν χρειάζεστε ακρίβεια σε ώρες και λεπτά.

Χρησιμοποιήστε Date για: ημερομηνίες λήξης τιμολογίων, γενέθλια, ημερομηνίες λήξης προϊόντων, ανανεώσεις συμβολαίων.


Χρησιμοποιήστε Datetime για: στιγμιότυπα επιβεβαίωσης παραγγελιών, ώρα έναρξης συναντήσεων, καταγραφές παρουσιών, προγραμματισμένες λειτουργίες αποθήκης.

Η αχρείαστη χρήση του Datetime εισάγει πολύπλοκο χειρισμό ζωνών ώρας χωρίς όφελος. Αν αμφιβάλλετε, ρωτήστε αν η ώρα της ημέρας πραγματικά επηρεάζει τη διαδικασία.

Επιχειρηματικά σενάρια χρήσης


Πού το συναντάμε μέσα στο Odoo


CRM: παρακολούθηση δραστηριοτήτων lead

Στο CRM διάφορα Datetime πεδία καταγράφουν κρίσιμα γεγονότα: πότε τέθηκε ένα lead σε κατάσταση «Σε εξέλιξη», πότε είναι προγραμματισμένη μια επαφή. Οι υπεύθυνοι πωλήσεων χρησιμοποιούν αυτές τις τιμές για να μετρήσουν χρόνους απόκρισης, να εντοπίσουν εγκαταλειμμένα leads και να δημιουργήσουν αναφορές δραστηριότητας. Με προσαρμοσμένα Datetime πεδία μπορείτε να καταγράψετε επιπλέον στιγμές, όπως πότε στάλθηκε μια προσφορά ή πότε έγινε μια κλήση.


Πωλήσεις: χρονικά σημάδια επιβεβαίωσης παραγγελίας

Στο sale.order, το date_order είναι Datetime και καταγράφει την ακριβή στιγμή επιβεβαίωσης μιας πώλησης. Αυτή η πληροφορία είναι ζωτικής σημασίας για αναφορές ανά ημέρα/ώρα, για μέτρηση χρόνων επεξεργασίας παραγγελιών και για έλεγχο αλλαγών μετά την επιβεβαίωση. Φιλτράρισμα με βάση αυτό το πεδίο είναι πολύ συνηθισμένο στις αναλύσεις πωλήσεων.


Αποθήκη: ημερομηνίες προγραμματισμένων μεταφορών

Το scheduled_date στις κινήσεις αποθέματος (stock.picking) είναι Datetime και βοηθάει τις ομάδες αποθήκης να προγραμματίζουν παραλαβές και αποστολές. Αυτό μπορεί να τροφοδοτήσει αυτόματες ενέργειες — π.χ. αυτοματοποιημένη ειδοποίηση όταν μια παράδοση καθυστερεί πάνω από συγκεκριμένο αριθμό ωρών, ώστε να ειδοποιηθούν οι πελάτες προτού επικοινωνήσουν οι ίδιοι.


Κατασκευές: ώρα έναρξης και λήξης παραγωγής

Οι εντολές παραγωγής χρησιμοποιούν Datetime για να καταγράψουν πότε ξεκίνησε και πότε τελείωσε η παραγωγή. Αυτά τα δεδομένα είναι απαραίτητα για προγραμματισμό δυναμικότητας, αναφορές αποδοτικότητας και ανάλυση απόδοσης ανά βάρδια ή χειριστή, ώστε να εντοπίζονται στενά σημεία κατά τη διάρκεια της ημέρας.


HR: παρουσίες και άδειες

Το module παρουσιών καταγράφει check-in και check-out με Datetime. Οι αιτήσεις άδειας συνήθως ορίζουν ακριβή ώρα έναρξης και λήξης. Υπολογισμοί μισθοδοσίας, υπερωρίες και κανόνες πληρωμών εξαρτώνται από την ακρίβεια αυτών των τιμών — ένα λάθος δευτερολέπτου μπορεί να επηρεάσει οικονομικά αποτελέσματα, οπότε εδώ η λεπτότητα είναι απαραίτητη.

Δημιουργία ή προσαρμογή του πεδίου Datetime


Τρόποι για να προσθέσετε ένα Datetime πεδίο


Υπάρχουν τρεις βασικοί τρόποι ανάλογα με το τεχνικό σας περιβάλλον και το επίπεδο εμπλοκής προγραμματιστή:

Χρήση Odoo Studio (χωρίς κώδικα)

  1. Το Odoo Studio επιτρέπει την προσθήκη πεδίων χωρίς να γράψετε κώδικα.
  2. Ανοίξτε το Studio από το κεντρικό μενού.
  3. Πλοηγηθείτε στη φόρμα όπου θέλετε το πεδίο.
  4. Σύρετε ένα Date & Time πεδίο από την πλαϊνή μπάρα στη φόρμα.
  5. Ορίστε ετικέτα, υποχρεωτικότητα και προεπιλεγμένη τιμή στις ιδιότητες του πεδίου.

Αποθηκεύστε και κλείστε το Studio — το Odoo δημιουργεί αυτόματα πεδίο με πρόθεμα x_studio_ και φροντίζει για τη βάση δεδομένων. Είναι η προτεινόμενη λύση για χρήστες επιχειρήσεων που θέλουν γρήγορη προσθήκη χρονοσημείων χωρίς προγραμματιστή.


Χρήση Python σε custom module

Για προγραμματιστές που διαχειρίζονται module και ανάγκη για version control, τα Datetime ορίζονται στο Python μοντέλο — η προτεινόμενη μέθοδος για παραγωγικές customizations:


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,
    )

Μετά την προσθήκη στο μοντέλο, εντάξτε το πεδίο στο αντίστοιχο view XML για να εμφανιστεί. Η στήλη TIMESTAMP δημιουργείται αυτόματα κατά την εγκατάσταση/αναβάθμιση του module — δεν απαιτείται χειροκίνητο SQL.


Χρήση XML-RPC API

Αν αυτοματοποιείτε ρυθμίσεις ή διαχειρίζεστε υποδομές απομακρυσμένα, μπορείτε να δημιουργήσετε πεδία μέσω XML-RPC API.


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',
    }]
)

Το ttype: 'datetime' ζητάει τη δημιουργία Datetime πεδίου. Το state: 'manual' δείχνει ότι το πεδίο δημιουργήθηκε εκτός module installation — το σωστό για πεδία από Studio ή API. Πολλές εταιρείες χρησιμοποιούν τέτοιες κλήσεις σε αυτοματισμούς διαμόρφωσης.

Καλές πρακτικές


1. Χρησιμοποιήστε fields.Datetime.now ως αναφορά συνάρτησης, όχι με κλήση

Όταν ορίζετε default, γράψτε default=fields.Datetime.now χωρίς παρενθέσεις. Αν βάλετε () η συνάρτηση εκτελείται μία φορά κατά το φόρτωμα της κλάσης και κάθε νέα εγγραφή θα κληρονομήσει το ίδιο «παγωμένο» timestamp — το σωστό είναι να καλείται κατά τη δημιουργία κάθε εγγραφής.


2. Ορίστε copy=False για χρονικά σήματα συμβάντων

Αν το πεδίο καταγράφει πότε συνέβη κάτι (π.χ. ημερομηνία επιβεβαίωσης), βάλτε copy=False. Όταν ένας χρήστης αντιγράφει μια εγγραφή, δεν πρέπει να μεταφέρονται τα ιστορικά timestamps — αλλιώς μολύνετε αθόρυβα τις αναφορές σας.


3. Περνάτε πάντα UTC όταν γράφετε μέσω API

Κατά τη δημιουργία/ενημέρωση μέσω XML-RPC, στείλτε Datetime σε UTC με μορφή 'YYYY-MM-DD HH:MM:SS'. Το API δεν κάνει μετατροπή ζώνης ώρας στην εγγραφή — ό,τι στείλετε αποθηκεύεται σαν UTC, οπότε η αποστολή τοπικής ώρας θα προκαλέσει ανεπιθύμητό offset.


4. Χρησιμοποιήστε readonly για αυτόματα χρονοσήματα

Τα πεδία που παράγονται από το σύστημα καλό είναι να είναι readonly στην διεπαφή, για να αποτρέπεται η χειροκίνητη αλλοίωση. Αν απαιτείται επεξεργασία, ελέγξτε την πρόσβαση με ρυθμίσεις ασφάλειας πεδίων αντί να αφήσετε το πεδίο ανοιχτό.


5. Επιλέξτε Date όταν η ώρα δεν χρειάζεται

Αν χρειάζεται μόνο ημερομηνία (π.χ. προθεσμία παράδοσης), χρησιμοποιήστε fields.Date. Το Datetime προσθέτει περιπλοκές ζωνών ώρας χωρίς λόγο — όσο πιο απλό το μοντέλο, τόσο πιο αξιόπιστο και εύκολο στη συντήρηση.

Συνηθισμένα λάθη


Σύγχυση ζωνών ώρας κατά την ανάγνωση ακατέργαστων τιμών

Το πιο κοινό πρόβλημα: όταν διαβάζετε απευθείας από τη βάση ή μέσω API βλέπετε την τιμή σε UTC, όχι την τοπική ώρα του χρήστη. Πολλές αναφορές και ενσωματώσεις χτίζονται πάνω σε αυτά τα raw δεδομένα και εμφανίζουν χρονικές αποκλίσεις. Πάντα κάνετε μετατροπή ζώνης στην πλευρά του πελάτη πριν εμφανίσετε αποτελέσματα σε τελικούς χρήστες.


Εγγραφή τοπικών χρόνων μέσω API

Αν στείλετε στην API μια τιμή σε τοπική ζώνη, η βάση θα την αποθηκεύσει ως να είναι UTC — με αποτέλεσμα λάθη εμφανιζόμενων ωρών ανάλογα με θερινές/χειμερινές αλλαγές. Αυτό το είδος σφάλματος εμφανίζεται συνήθως σε παραγωγή όταν πολλοί χρήστες σε διαφορετικές ζώνες αρχίζουν να δουλεύουν παράλληλα.


Χρήση default=fields.Datetime.now() με παρενθέσεις

Η προσθήκη παρενθέσεων στο default είναι λεπτό αλλά σοβαρό σφάλμα: fields.Datetime.now() εκτελείται μια φορά κατά το φόρτωμα της κλάσης. Όλες οι εγγραφές που δημιουργούνται στη διάρκεια ζωής του worker θα μοιράζονται το ίδιο timestamp — ένα σιωπηλό bug που δύσκολα εντοπίζεται γιατί τα timestamps φαίνονται «παραπαίρνουν» αλλά είναι όλα ίσα.


Παράλειψη του copy=False σε χρονικά σήματα

Χωρίς copy=False, μια διπλότυπη εγγραφή φέρνει μαζί της όλα τα Datetime από το πρωτότυπο. Ένα confirmation date ή start timestamp που μεταφέρεται στο αντίγραφο μολύνει αναφορές και audit trails — ένα μικρό λάθος με δυσανάλογες συνέπειες για την ποιότητα των δεδομένων.


Χρήση Datetime όπου αρκεί το Date

Όταν επιλέγετε Datetime για κάτι σαν ημερομηνία λήξης τιμολογίου, δημιουργείτε περιττό βάρος: οι χρήστες βλέπουν ώρα που δεν χρειάζονται, τρέχουν άσκοπες μετατροπές ζωνών στη θέαση και το UI γίνεται πιο φορτωμένο χωρίς λόγο. Επιλέξτε τον απλούστερο τύπο που μοντελοποιεί σωστά την ανάγκη σας.

Συμπεράσματα


Συνοψίζοντας: χρησιμότητα και εφαρμογές


Το Datetime είναι από τα πιο χρήσιμα πεδία στο Odoo όταν η ακρίβεια έχει αξία. Από το άνοιγμα ενός lead μέχρι την έναρξη παραγωγής και την καταγραφή παρουσιών, εμφανίζεται σε σχεδόν κάθε module. Το πιο σημαντικό που πρέπει να θυμάστε είναι το μοντέλο αποθήκευσης σε UTC — πολλές σφαλμάρες και προβλήματα συγχρονισμού προκύπτουν από την παρανόηση αυτής της αρχής.


Επιπλέον, με σωστό default χωρίς παρενθέσεις, copy=False όπου χρειάζεται και την επιλογή Date αντί για Datetime όταν η ώρα δεν έχει νόημα, το μοντέλο δεδομένων σας παραμένει καθαρό και οι αναφορές αξιόπιστες.

Στη Dasolo βοηθάμε εταιρείες να σχεδιάσουν, να προσαρμόσουν και να βελτιστοποιήσουν το Odoo σε όλο το επιχειρησιακό φάσμα. Είτε χρειάζεστε σχεδίαση δομής δεδομένων, προσθήκη προσαρμοσμένων πεδίων ή κατασκευή πλήρους module, η ομάδα μας μπορεί να αναλάβει. Επικοινωνήστε μαζί μας και ας συζητήσουμε το επόμενο Odoo έργο σας.

Πεδίο Datetime στο Odoo: Ο Απόλυτος Οδηγός
Dasolo 6 Μαρτίου 2026
Share this post
Σύνδεση to leave a comment