微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver中返回两个日期间相差几年零几月零几天,DATEDIFF通常不准确

--实际差12月+1天
select DATEDIFF(M,'2013-08-31','2014-09-01') as [13],DATEDIFF(D,'2014-09-01') AS [366],'2014-09-01')/30 AS [12],'2014-09-01')%30 AS [6]


--实际差12月+30天
select DATEDIFF(M,'2013-08-01','2014-08-31') AS [12],'2014-08-31') AS [395],'2014-08-31')/30 AS [13],'2014-08-31')%30 AS [5]


/*

 返回两个日期间相差几年零几月零几天
 @interval IN ('Y','YEAR','M','MONTH','D','DAY')
 
 不知道为什么,代码一样,存储过程正确,函数的不正确!求解!!!!

*/
CREATE FUNCTION DBO.getDateDiff(@Interval varchar(10),@startDate DATETIME,@endDate DATETIME)
RETURNS VARCHAR
AS 
BEGIN
 DECLARE @RETURN VARCHAR(10)
 DECLARE @startDatetime DATETIME
 DECLARE @endDatetime DATETIME
 SET @startDatetime = @startDate
 SET @endDatetime = @endDate

 IF @Interval NOT IN('Y','DAY') OR DATEDIFF(D,@startDatetime,@endDatetime)<0
	RETURN -1

 --返回相差年份	
 IF @interval IN ('Y','YEAR')
	SET @RETURN = DATEDIFF(D,@endDatetime)/365
 	 
 --返回相差年份后相差的月份	
 IF @Interval IN ('M','MONTH')
 BEGIN
	SET @startDatetime = DATEADD(YEAR,@endDatetime)/365,@startDatetime)
	IF DAY(@startDatetime) <= DAY(@endDatetime)
		SET @RETURN = DATEDIFF(M,@endDatetime)
	ELSE
		SET @RETURN = DATEDIFF(M,DATEADD(M,-1,@endDatetime))
 END

 --返回相差月份后相差的天数
 IF @Interval IN ('D','DAY')
 BEGIN
	SET @startDatetime = DATEADD(YEAR,@startDatetime)
	IF DAY(@startDatetime) <= DAY(@endDatetime)
		SET @startDatetime = DATEADD(M,DATEDIFF(M,@endDatetime),@startDatetime)
	ELSE
		SET @startDatetime = DATEADD(M,@endDatetime)),@startDatetime)
	SET @RETURN = DATEDIFF(D,@endDatetime)
 END

return @RETURN
END

/*
SELECT DBO.getDateDiff('Y','2013-08-23','2015-11-11')
SELECT DBO.getDateDiff('M','2015-11-11')
SELECT DBO.getDateDiff('D','2015-11-11')

结果:
2
2
1	

*/


CREATE PROCEDURE DBO.getDateDiffKK(@Interval varchar(10),@endDate DATETIME)
AS 
BEGIN
 DECLARE @RETURN VARCHAR(10)
 DECLARE @startDatetime DATETIME
 DECLARE @endDatetime DATETIME
 SET @startDatetime = @startDate
 SET @endDatetime = @endDate

 IF @Interval NOT IN('Y',@endDatetime)
 END

SELECT @RETURN
END

/*

EXEC getDateDiffKK 'Y','2015-11-11' 
EXEC getDateDiffKK 'M','2015-11-11' 
EXEC getDateDiffKK 'D','2015-11-11' 
结果:
2
2
19

*/


--选择时计算结果:

DECLARE @QSRQ VARCHAR(10)
DECLARE @JSRQ VARCHAR(10)
SET @QSRQ ='2013-08-23'
SET @JSRQ ='2015-11-11'
SELECT
	CASE WHEN DAY(@QSRQ) <= DAY(@JSRQ) THEN DATEDIFF(M,@QSRQ,@JSRQ)
	ELSE DATEDIFF(M,@JSRQ)) end  AS 月份数,CASE WHEN DAY(@QSRQ) <= DAY(@JSRQ) THEN DATEDIFF(D,@JSRQ),@QSRQ),@JSRQ)
	ELSE DATEDIFF(D,@JSRQ)),@JSRQ) end  AS 天数
/*
结果:
月份数	天数
26		19

日期差26个月零19天
*/

--错误:
select DATEDIFF(M,@JSRQ) --26
select DATEDIFF(D,@JSRQ) --810

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐