Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chuyển đổi dữ liệu cột chênh lệch TIMESTAMP sang định dạng chuỗi

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle có khái niệm chỉ mục được lọc không?

  2. Thay thế hàm trong Oracle SQL

  3. Làm cách nào tôi có thể kiểm tra null và không null cùng một lúc trong sql?

  4. Oracle MERGE nâng lỗi ORA-00904

  5. Kết nối giữa hình ảnh và tiên tri