-2

我需要使用 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 
4

2 回答 2

1

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

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

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。

于 2013-09-16T19:57:22.893 回答
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')

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

或者

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);

使用它你可以操纵。

于 2013-09-16T19:47:04.927 回答