Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQL:Czy można pola SUM() typu INTERVAL?

Obawiam się, że nie będziesz miał szczęścia z rozwiązaniem, które działa zarówno w Oracle, jak i MSSQL. Arytmetyka dat jest czymś, co bardzo różni się w różnych odmianach DBMS.

W każdym razie w Oracle możemy używać dat w prostej arytmetyce. I mamy funkcję NUMTODSINTERVAL, która zamienia liczbę na INTERWAŁ OD DNIA DO DRUGIEGO. Połączmy je więc razem.

Proste dane testowe, dwa wiersze z parami dat w odstępie około dwunastu godzin:

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>

Proste zapytanie SQL, aby znaleźć sumę czasu, który upłynął:

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

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

SQL>

Nieco ponad dzień, czego byśmy się spodziewali.

Praca z kolumnami TIMESTAMP jest nieco bardziej pracochłonna, ale nadal możemy zastosować tę samą sztuczkę.

W poniższej próbce. T42T jest tym samym co T42, tylko kolumny mają TIMESTAMP zamiast DATE dla ich typu danych. Zapytanie wyodrębnia różne składniki DS INTERVAL i konwertuje je na sekundy, które są następnie sumowane i konwertowane z powrotem na 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>

Przynajmniej ten wynik jest w ciągu kilku sekund!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Formatowanie liczb w Oracle za pomocą TO_CHAR

  2. Jak skonfigurować schemat bazy danych, w którym istnieją dwie współbieżne relacje wiele-wiele?

  3. Łączenie Oracle z SQL Server przez bezpieczne połączenie

  4. plik lub operacja LOB FILEOPEN nie powiodła się podczas ładowania pliku XML do tabeli

  5. ORA-01403:nie znaleziono danych dla Wybierz do