如何计算日期之间的天数差异

时间:2013-09-16 19:40:39

标签: sql sql-server date

我需要使用MSSQL

计算日期之间的天数,详情如下

每个月都应该被视为有30天(即使它没有)

2013年1月2日至2013年3月2日之间的差异将是

(30-2) + 30 + 2 days  
where (30-2) will be for January  
      30 will be for February  
      2 will be for March 

2 个答案:

答案 0 :(得分:1)

 create or replace function datediff( p_what in varchar2, 
                                      p_d1   in date, 
                                      p_d2   in date ) return number 
    as 
        l_result    number; 
    begin 
        select (p_d2-p_d1) * 
               decode( upper(p_what), 
                       'DAY', 1, 'SS', 24*60*60, 'MI', 24*60, 'HH', 24, NULL ) 
        into l_result from dual; 

       return l_result; 
   end; 
   /

这就是我在Oracle中所做的(礼貌:ASKTOM)。 我得到了不同的日,小时,分钟或秒。

在MS SQL中,

PRINT DATEDIFF(DAY, '1/1/2011', '3/1/2011')

这给出了两个日期之间跨越午夜边界的次数。如果您在计数中包含两个日期,则可能决定需要添加一个 - 或者如果您不想包含任何一个日期,则减去一个日期。

OR

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate datetime2 = '2009-05-04 12:10:09.3312722'; 
SELECT DATEDIFF(day, @startdate, @enddate);
  

使用此功能可以操作。

答案 1 :(得分:1)

您希望在SQL Server中获得类似于Oracle的MONTHS_BETWEEN的结果。

这是我在Teradata中编写的SQL函数,您可能只需要将EXTRACT更改为YEAR / MONTH / DAY(日期)

REPLACE FUNCTION MONTHS_BETWEEN(date1 DATE, date2 DATE)
RETURNS FLOAT
SPECIFIC months_between_DT
RETURNS NULL ON NULL INPUT
CONTAINS SQL
DETERMINISTIC
COLLATION INVOKER
INLINE TYPE 1
RETURN 
   (EXTRACT(YEAR FROM date1) * 12 + EXTRACT(MONTH FROM date1))
 - (EXTRACT(YEAR FROM date2) * 12 + EXTRACT(MONTH FROM date2))
 + CASE
     WHEN EXTRACT(MONTH FROM date2) <> EXTRACT(MONTH FROM date2+1) AND
          EXTRACT(MONTH FROM date1) <> EXTRACT(MONTH FROM date1+1)
     THEN 0
     ELSE (CAST(1 AS FLOAT))/31 * (EXTRACT(DAY FROM date1) - EXTRACT(DAY FROM date2))
   END
;

然后,您只需将结果* 30相乘并将其转换为INT。