Sql计算两个日期之间的天数

问题

求两个日期之间相差的天数。例如,想了解员工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)。要得到相差的天数,只需使用相应数据库中方法,将返回的两个值相减即可。

 

你可能感兴趣的:(Sql计算两个日期之间的天数)