我需要使用 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
我需要使用 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
看起来您希望在 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。
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);
使用它你可以操纵。