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

SQL:Có thể SUM () các trường kiểu INTERVAL không?

Tôi e rằng bạn sẽ không gặp may với một giải pháp hoạt động trên cả Oracle và MSSQL. Số học ngày tháng là một cái gì đó rất khác trên các phiên bản khác nhau của DBMS.

Dù sao, trong Oracle, chúng ta có thể sử dụng ngày tháng trong số học đơn giản. Và chúng ta có một hàm NUMTODSINTERVAL biến một số thành CAN THIỆP NGÀY ĐẾN THỨ HAI. Vì vậy, hãy đặt chúng lại với nhau.

Dữ liệu thử nghiệm đơn giản, hai hàng với các cặp ngày cách nhau mười hai giờ:

SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL> select * from t42
  2  /

D1                   D2
-------------------- --------------------
27-jul-2010 12:10:26 27-jul-2010 00:00:00
28-jul-2010 12:10:39 28-jul-2010 00:00:00

SQL>

Truy vấn SQL đơn giản để tìm tổng thời gian đã trôi qua:

SQL> select numtodsinterval(sum(d1-d2), 'DAY')
  2  from t42
  3  /

NUMTODSINTERVAL(SUM(D1-D2),'DAY')
-----------------------------------------------------
+000000001 00:21:04.999999999

SQL>

Chỉ hơn một ngày, đó là những gì chúng tôi mong đợi.

Làm việc với các cột TIMESTAMP hơi khó khăn hơn một chút, nhưng chúng ta vẫn có thể thực hiện theo cùng một thủ thuật.

Trong mẫu sau. T42T giống như T42 chỉ có các cột có TIMESTAMP thay vì DATE cho kiểu dữ liệu của chúng. Truy vấn trích xuất các thành phần khác nhau của DS INTERVAL và chuyển đổi chúng thành giây, sau đó được tổng hợp và chuyển đổi lại thành INTERVAL:

SQL> select numtodsinterval(
  2              sum(
  3                  extract (day from (t1-t2)) * 86400
  4                   + extract (hour from (t1-t2)) * 3600
  5                   + extract (minute from (t1-t2)) * 600
  6                   + extract (second from (t1-t2))
  7            ), 'SECOND')
  8  from t42t
  9  /

NUMTODSINTERVAL(SUM(EXTRACT(DAYFROM(T1-T2))*86400+EXTRACT(HOURFROM(T1-T2))*
---------------------------------------------------------------------------
+000000001 03:21:05.000000000

SQL>

Ít nhất kết quả này tính bằng giây tròn!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để khắc phục nguyên nhân gây ra ngoại lệ Hibernate IllegalArgumentException xảy ra khi gọi setter?

  2. Làm cách nào để định cấu hình vị trí tệp tnsnames Oracle của tôi?

  3. Hiệu quả của việc tính toán số lượng nhân lực hàng quý

  4. Trục động trong sql oracle

  5. Trình điều khiển ODP.NET được quản lý không hiển thị trong hộp thoại Nguồn dữ liệu