问题
求两个日期之间相差的秒数,例如,求ALLEN和WARD的HIREDATE(聘用日期)之间相差的时间,分别用秒、分、小时数表示。
解决方案
知道了两个日期之间的天数,就可以计算出秒、分、小时数,因为它们是组成一天的时间单位。
DB2
使用函数DAYS获得ALLEN_HD和WARD_HD之间相差的天数。然后,进行乘法操作,就能得到每个时间单位的值:
1 select dy*24 hr, dy*24*60 min, dy*24*60*60 sec
2 from (
3 select ( days(max(case when ename = 'WARD'
4 then hiredate
5 end)) -
6 days(max(case when ename = 'ALLEN'
7 then hiredate
8 end))
9 ) as dy
10 from emp
11 ) x
MySQL和SQL Server
使用函数DATEDIFF获得ALLEN_HD和WARD_HD之间相差的天数。然后,进行乘法操作,就能得到每个时间单位的值:
1 select datediff(day,allen_hd,ward_hd)*24 hr,
2 datediff(day,allen_hd,ward_hd)*24*60 min,
3 datediff(day,allen_hd,ward_hd)*24*60*60 sec
4 from (
5 select max(case when ename = 'WARD'
6 then hiredate
7 end) as ward_hd,
8 max(case when ename = 'ALLEN'
9 then hiredate
10 end) as allen_hd
11 from emp
12 ) x
Oracle和PostgreSQL
使用减法操作,返回ALLEN_HD和WARD_HD之间相差的天数。然后,进行乘法操作,就能得到每个时间单位的值:
1 select dy*24 as hr, dy*24*60 as min, dy*24*60*60 as sec
2 from (
3 select (max(case when ename = 'WARD'
4 then hiredate
5 end) -
6 max(case when ename = 'ALLEN'
7 then hiredate
8 end)) as dy
9 from emp
10 ) x
讨论
所有解决方案的内联视图X都会返回WARD和ALLEN的HIREDATE(聘用日期),如下所示:
select max(case when ename = 'WARD'
then hiredate
end) as ward_hd,
max(case when ename = 'ALLEN'
then hiredate
end) as allen_hd
from emp
WARD_HD ALLEN_HD
----------- -----------
22-FEB-1981 20-FEB-1981
将WARD_HD和ALLEN_HD之间相差的天数乘以24(一天的小时数)、1440(一天的分钟数)、86400(一天的秒数)即可。