Khi bạn thêm hoặc bớt dấu thời gian, kết quả là một khoảng thời gian
, không phải dấu thời gian khác. Bạn có thể sử dụng extract
chức năng
để kéo các thành phần ra khỏi đó. Nếu giá trị của bạn luôn là con số thứ hai, bạn có thể chỉ cần trích xuất giây và nhân với một nghìn để có được mili giây:
with t as (
select 1 as msg_guid,
interval '0 0:0:0.343009' day to second as diff
from dual
)
select trunc(extract (second from diff) * 1000)
from t;
TRUNC(EXTRACT(SECONDFROMDIFF)*1000)
-----------------------------------
343
Ở đây truy vấn thực sự của bạn sẽ thay thế cho CTE giả mà tôi đã sử dụng với một ký tự khoảng thời gian.
Nếu khoảng thời gian có thể hơn một giây thì có lẽ bạn sẽ muốn nhận toàn bộ giá trị tính bằng mili giây, vì vậy bạn cần trích xuất tất cả các phần tử và cộng chúng lại với nhau, nhân từng phần tử dựa trên những gì chúng đại diện - vì vậy cả ngày sẽ là 86400000 mili giây, v.v.; các yếu tố đơn giản sẽ xuất hiện như:
column diff format a25
with t as (
select 1 as msg_guid,
systimestamp - trunc(systimestamp) as diff
from dual
)
select diff,
extract (day from diff) as dd,
extract (hour from diff) as hh,
extract (minute from diff) as mi,
extract (second from diff) as ss
from t;
DIFF DD HH MI SS
---------------------- ---------- ---------- ---------- ----------
0 9:13:26.150627 0 9 13 26.150627
Và bạn có thể kết hợp chúng như sau:
with t as (
select 1 as msg_guid,
systimestamp - trunc(systimestamp) as diff
from dual
)
select diff,
trunc(1000 * (
extract (day from diff) * (60*60*24)
+ extract (hour from diff) * (60*60)
+ extract (minute from diff) * 60
+ extract (second from diff)
)) as milliseconds
from t;
DIFF MILLISECONDS
---------------------- ------------
0 9:13:27.650365 33207650
Nhưng dựa trên câu hỏi trước của bạn, có thể bạn muốn nó dưới dạng một chuỗi, như các thành phần riêng biệt:
with t as (
select 1 as msg_guid,
systimestamp - trunc(systimestamp) as diff
from dual
)
select diff,
extract (day from diff) || ' DAYS '
|| extract (hour from diff) || ' HOURS '
|| extract (minute from diff) || ' MINUTES '
|| trunc(extract (second from diff)) || ' SECONDS '
|| (trunc(extract (second from diff) * 1000)
- (trunc(extract (second from diff)) * 1000)) || ' MILLISECONDS'
as text
from t;
DIFF TEXT
---------------------- -------------------------------------------------------
0 9:43:38.896007 0 DAYS 9 HOURS 43 MINUTES 38 SECONDS 896 MILLISECONDS
SQL Fiddle dựa trên dữ liệu mẫu của bạn, loại và với phép tính thời gian được đảo ngược để giá trị là số dương.