Πώς μπορώ να υπολογίσω τη χρονική διαφορά σε χιλιοστά του δευτερολέπτου μεταξύ δύο χρονοσφραγίδων στην Oracle;
Όταν αφαιρείτε δύο μεταβλητές τύπου TIMESTAMP
, λαμβάνετε μια INTERVAL DAY TO SECOND
η οποία περιλαμβάνει έναν αριθμό χιλιοστών του δευτερολέπτου ή/και μικροδευτερολέπτων ανάλογα με την πλατφόρμα. Εάν η βάση δεδομένων τρέχει σε Windows, η systimestamp
θα έχει γενικά χιλιοστά του δευτερολέπτου. Εάν η βάση δεδομένων τρέχει σε Unix, το systimestamp
θα έχει γενικά μικροδευτερόλεπτα.
1 select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' )
2* from dual
SQL> /
SYSTIMESTAMP-TO_TIMESTAMP('2012-07-23','YYYY-MM-DD')
---------------------------------------------------------------------------
+000000000 14:51:04.339000000
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση EXTRACT
για να εξαγάγετε τα μεμονωμένα στοιχεία ενός INTERVAL DAY TO SECOND
.
SQL> ed
Wrote file afiedt.buf
1 select extract( day from diff ) days,
2 extract( hour from diff ) hours,
3 extract( minute from diff ) minutes,
4 extract( second from diff ) seconds
5 from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff
6* from dual)
SQL> /
DAYS HOURS MINUTES SECONDS
---------- ---------- ---------- ----------
0 14 55 37.936
Μπορείτε στη συνέχεια να μετατρέψετε κάθε ένα από αυτά τα στοιχεία σε χιλιοστά του δευτερολέπτου και να τα προσθέσετε
SQL> ed
Wrote file afiedt.buf
1 select extract( day from diff )*24*60*60*1000 +
2 extract( hour from diff )*60*60*1000 +
3 extract( minute from diff )*60*1000 +
4 round(extract( second from diff )*1000) total_milliseconds
5 from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff
6* from dual)
SQL> /
TOTAL_MILLISECONDS
------------------
53831842
Κανονικά, ωστόσο, είναι πιο χρήσιμο να έχετε είτε την αναπαράσταση INTERVAL DAY TO SECOND
είτε να έχετε ξεχωριστές στήλες για τις ώρες, τα λεπτά, τα δευτερόλεπτα κ.λπ. παρά να υπολογίζετε το συνολικό αριθμό χιλιοστών του δευτερολέπτου μεταξύ δύο τιμών TIMESTAMP
.
SELECT numtodsinterval(date1-date2,'day') time_difference from dates;
SELECT (extract(DAY FROM time2-time1)*24*60*60)+
(extract(HOUR FROM time2-time1)*60*60)+
(extract(MINUTE FROM time2-time1)*60)+
extract(SECOND FROM time2-time1)
into diff FROM dual;
RETURN diff;