Η Oracle υποστηρίζει τύπους ημερομηνίας και ώρας, λίγο διαφορετικά από την SQL2. Αντί να χρησιμοποιεί δυο διαφορετικές οντότητες ημερομηνία και ώρα, η Oracle χρησιμοποιεί μόνο μια, την DATE. Ο τύπος DATE αποθηκεύετει με έναν ειδικό τρόπο και περιλαμβάνει εκτός από μέρες, μήνες και χρόνια, ώρες, λεπτά και δευτερόλεπτα.
Ο τύπος DATE χρησιμοποιείται με τον ίδιο τρόπο όπως και οι άλλοι ενσωματωμένοι τύποι στην Oracle πχ. INT. Για παράδειγμα η ακόλουθη εντολή SQL δημιουργεί έναν πίνακα με μια στήλη τύπου DATE :
create table x(a int, b date);
Όταν εκτυπώνεται μια τιμή DATE , η Oracle πρέπει να μετατρέψει την τιμή αυτή από την εσωτερική της αναπαράσταση σε εκτυπώσιμο string. Η μετατροπή αυτή γίνεται με μια συνάρτηση την TO_CHAR, σύμφωνα με μια μορφοποίηση που θέλει ο χρήστης. Η εκ τω προτέρω μορφοποίηση που υποστηρίζει η Oracle για τον τύπο DATE είναι "DD-MON-YYYY". Έτσι όταν εκτελέσουμε την ερώτηση :
μοιάζει με :select b from x;θα δούμε κάτι που θα
B --------- 01-APR-98
Όποτε εκτυπώνεται μια τιμή DATE η Oracle θα καλέσει αυτόματα τη συνάρτηση TO_CHAR με την εκ τω προτέρω μορφοποίηση "DD-MON-YYYY". Παρόλα αυτά μπορεί ο χρήστης να χρησιμοποιήσει τη δική του μορφοποίηση για την ημερομηνία, καλώντας ο ίδιος την TO_CHAR. Για παράδειγμα η ερώτηση:
select to_char(b, 'YYYY/MM/DD') as b from x;Επιστρέφει:
B --------------------------------------------------------------------------- 1998/04/01
Η γενική χρήση της TO_CHAR είναι :
TO_CHAR(<date>, '<format>')
όπου το <format> είναι ένα string που μπορεί να έχει μέχρι και 40 διαφορετικές παραλλαγές. Οι πιο συνηθισμένες είναι οι παρακάτω:
ΜΜ | Μήνας με αριθμητική τιμή (πχ 03) |
ΜΟΝ | Συντομευμένο όνομα μήνα (πχ. JUL) |
ΜΟΝΤΗ | Πλήρες όνομα μήνα (πχ. JULY) |
DD | Μέρα του μήνα (πχ. 24) |
DY | Συντομευμένο όνομα μέρας (πχ. FRI) |
YYYY | Έτος με 4 ψηφία (πχ. 1999) |
YY | Δύο τελευταία ψηφία του έτους (πχ. 99) |
RR | Σαν το YY αλλά το 06 θεωρείται 2006 αντί για 1906 |
AM (or PM) | Προ ή μετά μεσημβρίας |
HH | Ώρα της ημέρας (1-12) |
HH24 | Ώρα της ημέρας (0-23) |
MI | Λεπτό (0-59) |
SS | Δευτερόλεπτο (0-59) |
Χρησιμοποιώντας τα παραπάνω μπορούμε να εκτυπώσουμε μια ημερομηνία με τη συνάρτηση TO_CHAR. Η εισαγωγή της ημερομηνίας στη βάση γίνεται με τη βοήθεια της συνάρτησης TO_DATE, που μετατρέπει ένα string σε τύπο DATE . Όπως και στην εισαγωγή δεν είναι απαραίτητο να καλέσουμε την TO_DATE. Η Oracle το κάνει μόνη της και μετατρέπει το string σε ημερομηνία, χρησιμοποιώντας τη μορφοποίηση "DD-MON-YYYY". Για παράδειγμα για να εισάγουμε μια ν-άδα που έχει ένα στοιχείο τύπου DATE , αρκεί να γράψουμε:
insert into x values(99, '31-may-98');
Ενναλακτικά μπορούμε να καλέσουμε εμείς την TO_DATE:
insert into x values(99, to_date('1998/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));
Η γενική σύνταξη της TO_DATEείναι η εξής:
TO_DATE(<string>, '<format>')
όπου <format> είναι ένα string με τις ίδιες επιλογές όπως και στην TO_CHAR.
Τέλος μπορούμε να αλλάξουμε την καθορισμένη από την Oracle μορφοποίηση της DATE από "DD-MON-YYYY" σε όποια άλλη μορφή εμείς θέλουμε, χρησιμοποιώντας την ακόλουθη εντολή από την sqlplus:
alter session set NLS_DATE_FORMAT='<my_format>';
Η αλλαγή θα έχει ισχύ μόνο για την τρέχουσα σύνοδο της sqlplus.
H συνάρτηση SYSDATE επιστρέφει μια τιμή DATE που περιέχει την τρέχουσα ημερομηνία και ώρα στο σύστημά σας. Για παράδειγμα:
select to_char(sysdate, 'Dy DD-Mon-YYYY HH24:MI:SS') as "Current Time" from dual;
επιστρέφει
Current Time --------------------------------------------------------------------------- Tue 21-Apr-1998 21:18:27
Παρατηρούμε δυο πράγματα :
Μπορούμε να συγκρίνουμε τιμές DATE χρησιμοποιώντας τους γνωστούς τελεστές σύγκρισης: =, !=, > κ.α.
Μπορούμε να αφαιρέσουμε δυο τιμές DATE και το αποτέλεσμα θα είναι ένας FLOAT που θα αντιπροσωπεύει τις ημέρες μεταξύ των δυο αυτών τιμών. Γενικά το αποτέλεσμα θα περιέχει και δεκαδικό μέρος αφού ο τύπος DATE περιλαμβάνει και ώρα. Για προφανείς λόγους καμία άλλη πράξη δεν επιτρέπεται μεταξύ δυο τιμών DATE .
Μπορούμε σε μια τιμή DATE να προσθέσουμε και να αφαιρέσουμε έναν αριθμό, που θα ερμηνευτεί σαν αριθμός ημερών. Για παράδειγμα SYSDATE + 1 θα είναι η αυριανή ημέρα. Δεν μπορείς να διαιρέσεις ή να πολλαπλασιάσεις τιμές DATE με άλλους αριθμούς.
Με τη βοήθεια της TO_CHARμπορούμε να χρησιμοποιήσουμε πράξεις σε string για να χειριστοούμε τιμές DATE . Για παράδειγμα , to_char(<date>, 'DD-MON-YY') like '%JUN%' είναι αληθές αν η <date> είναι του Ιουνίου.