问题
求两个日期之间相差的天数。例如,想了解员工ALLEN 和员工WARD的HIREDATE(聘用日期)之间相差的天数。
解决方案
DB2
使用两个内联视图求WARD和ALLEN的HIREDATE(聘用日期)。然后使用DAYS 函数从一个HIREDATE中减去另一个HIREDATE:
1 select days(ward_hd) - days(allen_hd)
2 from (
3 select hiredate as ward_hd
4 from emp
5 where ename = 'WARD'
6 ) x,
7 (
8 select hiredate as allen_hd
9 from emp
10 where ename = 'ALLEN'
11 ) y
Oracle和PostgreSQL
使用两个内联视图求WARD和ALLEN的HIREDATE(聘用日期)。然后从一个日期中减去另一个日期:
1 select ward_hd - allen_hd
2 from (
3 select hiredate as ward_hd
4 from emp
5 where ename = 'WARD'
6 ) x,
7 (
8 select hiredate as allen_hd
9 from emp
10 where ename = 'ALLEN'
11 ) y
MySQL和SQL Server
使用DATEDIFF函数可以求两个日期之间相差的天数。MySQL中的DATEDIFF函数仅需要两个参数 (即要计算相差天数的两个日期),第一个参数应是两个日期中较小的值,以避免出现负值(SQL Server中正好相反)。在SQL Server中,可以指定该函数返回值所表示的类型(在这个例子中,返回以“日”为单位的差)。下面的解决方案采用了SQL Server的版本:
1 select datediff(day,allen_hd,ward_hd)
2 from (
3 select hiredate as ward_hd
4 from emp
5 where ename = 'WARD'
6 ) x,
7 (
8 select hiredate as allen_hd
9 from emp
10 where ename = 'ALLEN'
11 ) y
MySQL用户只需去掉该函数的第一个参数,交换一下传递ALLEN_HD和WARD_HD的顺序即可。
讨论
对于所有的解决方案,内联视图X和Y分别返回员工WARD和ALLEN的HIREDATE。例如:
select ward_hd, allen_hd
from (
select hiredate as ward_hd
from emp
where ename = 'WARD'
) y,
(
select hiredate as allen_hd
from emp
where ename = 'ALLEN'
) x
WARD_HD ALLEN_HD
----------- ---------
22-FEB-1981 20-FEB-1981
注意:这里产生了笛卡儿积,因为没有在X和Y之间指定联接条件。在这种特定情况下,缺少连接并没有害处,因为X和Y的基数都为1,这样结果集最终就只有一行(很显然,1?=1)。要得到相差的天数,只需使用相应数据库中方法,将返回的两个值相减即可。