我需要使用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
答案 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。