SQL:是否可以使用INTERVAL类型的SUM()字段?

Žyg*_*tas 5 t-sql sql-server oracle plsql date-arithmetic

我想把INTERVAL加起来.例如

SELECT SUM(TIMESTAMP1 - TIMESTAMP2) FROM DUAL

是否可以编写一个可以在Oracle和SQL Server上运行的查询?如果是这样,怎么样?

编辑:将DATE更改为INTERVAL

APC*_*APC 6

我担心你会在运行Oracle和MSSQL的解决方案中运气不好.日期算术在DBMS的各种风格上是非常不同的.

无论如何,在Oracle中我们可以使用简单算术的日期.我们有一个函数NUMTODSINTERVAL,它将数字转换为DAY TO SECOND INTERVAL.所以我们把它们放在一起吧.

简单的测试数据,两行,成对日期相隔十二小时:

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>
Run Code Online (Sandbox Code Playgroud)

简单的SQL查询以查找已用时间的总和:

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

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

SQL>
Run Code Online (Sandbox Code Playgroud)

仅仅过了一天,这就是我们所期望的.


"编辑:将日期更改为INTERVAL"

使用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>
Run Code Online (Sandbox Code Playgroud)

至少这个结果是在几秒钟内!


Žyg*_*tas 5

好吧,经过一些地狱之后,借助stackoverflowers的答案,我找到了符合我需求的解决方案.


SELECT
  SUM(CAST((DATE1 + 0) - (DATE2 + 0) AS FLOAT) AS SUM_TURNAROUND
FROM MY_BEAUTIFUL_TABLE
GROUP BY YOUR_CHOSEN_COLUMN
Run Code Online (Sandbox Code Playgroud)

这将返回一个浮点数(对我来说完全没问题),它代表Oracle ant SQL Server上的几天.

我加入零到这两个日期的原因是因为在我的情况下,对Oracle数据库日期栏,TIMESTAMP类型和SQL Server上的是DATETIME类型(这显然是不可思议)的.所以加入零到TIMESTAMP在Oracle工作就像铸造日期和它不会对SQL Server的DATETIME类型的任何影响.

感谢你们!你真的很有帮助.