Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL:Възможно ли е да SUM() полета от тип INTERVAL?

Страхувам се, че няма да имате късмет с решение, което работи както в Oracle, така и в MSSQL. Аритметиката на датата е нещо, което е много различно в различните разновидности на СУБД.

Както и да е, в Oracle можем да използваме дати в проста аритметика. И имаме функция NUMTODSINTERVAL, която превръща число в ИНТЕРВАЛ ОТ ДЕН ДО ВТОРА. Така че нека ги съберем заедно.

Прости тестови данни, два реда с двойки дати с приблизително дванадесет часа разлика:

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>

Проста SQL заявка за намиране на сбора от изминалото време:

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

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

SQL>

Малко повече от ден, което бихме очаквали.

Работата с колони TIMESTAMP е малко по-трудоемка, но все пак можем да работим със същия трик.

В следната проба. T42T е същото като T42, само че колоните имат TIMESTAMP, а не DATE за своя тип данни. Заявката извлича различните компоненти на DS INTERVAL и ги преобразува в секунди, които след това се сумират и преобразуват обратно в 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>

Поне този резултат е в кръгли секунди!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Странен проблем с членството в ASP

  2. Обединете XMLType възли в заявка на Oracle

  3. Извикване на Python от Oracle

  4. Как оракул rowid се генерира вътрешно?

  5. Въпроси за интервю за Oracle