Žyg*_*tas 5 t-sql sql-server oracle plsql date-arithmetic
我想把INTERVAL加起来.例如
SELECT SUM(TIMESTAMP1 - TIMESTAMP2) FROM DUAL
是否可以编写一个可以在Oracle和SQL Server上运行的查询?如果是这样,怎么样?
编辑:将DATE更改为INTERVAL
我担心你会在运行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)
至少这个结果是在几秒钟内!
好吧,经过一些地狱之后,借助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类型的任何影响.
感谢你们!你真的很有帮助.