--实际差12月+1天
select DATEDIFF(M,'2013-08-31','2014-09-01') as [13]
,DATEDIFF(D,'2013-08-31','2014-09-01') AS [366]
,DATEDIFF(D,'2013-08-31','2014-09-01')/30 AS [12]
,DATEDIFF(D,'2013-08-31','2014-09-01')%30 AS [6]
--实际差12月+30天
select DATEDIFF(M,'2013-08-01','2014-08-31') AS [12]
,DATEDIFF(D,'2013-08-01','2014-08-31') AS [395]
,DATEDIFF(D,'2013-08-01','2014-08-31')/30 AS [13]
,DATEDIFF(D,'2013-08-01','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','YEAR','M','MONTH','D','DAY') OR DATEDIFF(D,@startDatetime,@endDatetime)<0
RETURN -1
--返回相差年份
IF @interval IN ('Y','YEAR')
SET @RETURN = DATEDIFF(D,@startDatetime,@endDatetime)/365
--返回相差年份后相差的月份
IF @Interval IN ('M','MONTH')
BEGIN
SET @startDatetime = DATEADD(YEAR,DATEDIFF(D,@startDatetime,@endDatetime)/365,@startDatetime)
IF DAY(@startDatetime) <= DAY(@endDatetime)
SET @RETURN = DATEDIFF(M,@startDatetime,@endDatetime)
ELSE
SET @RETURN = DATEDIFF(M,@startDatetime,DATEADD(M,-1,@endDatetime))
END
--返回相差月份后相差的天数
IF @Interval IN ('D','DAY')
BEGIN
SET @startDatetime = DATEADD(YEAR,DATEDIFF(D,@startDatetime,@endDatetime)/365,@startDatetime)
IF DAY(@startDatetime) <= DAY(@endDatetime)
SET @startDatetime = DATEADD(M,DATEDIFF(M,@startDatetime,@endDatetime),@startDatetime)
ELSE
SET @startDatetime = DATEADD(M,DATEDIFF(M,@startDatetime,DATEADD(M,-1,@endDatetime)),@startDatetime)
SET @RETURN = DATEDIFF(D,@startDatetime,@endDatetime)
END
return @RETURN
END
/*
SELECT DBO.getDateDiff('Y','2013-08-23','2015-11-11')
SELECT DBO.getDateDiff('M','2013-08-23','2015-11-11')
SELECT DBO.getDateDiff('D','2013-08-23','2015-11-11')
结果:
2
2
1
*/
CREATE PROCEDURE DBO.getDateDiffKK(@Interval varchar(10),@startDate DATETIME,@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','YEAR','M','MONTH','D','DAY') OR DATEDIFF(D,@startDatetime,@endDatetime)<0
RETURN -1
--返回相差年份
IF @interval IN ('Y','YEAR')
SET @RETURN = DATEDIFF(D,@startDatetime,@endDatetime)/365
--返回相差年份后相差的月份
IF @Interval IN ('M','MONTH')
BEGIN
SET @startDatetime = DATEADD(YEAR,DATEDIFF(D,@startDatetime,@endDatetime)/365,@startDatetime)
IF DAY(@startDatetime) <= DAY(@endDatetime)
SET @RETURN = DATEDIFF(M,@startDatetime,@endDatetime)
ELSE
SET @RETURN = DATEDIFF(M,@startDatetime,DATEADD(M,-1,@endDatetime))
END
--返回相差月份后相差的天数
IF @Interval IN ('D','DAY')
BEGIN
SET @startDatetime = DATEADD(YEAR,DATEDIFF(D,@startDatetime,@endDatetime)/365,@startDatetime)
IF DAY(@startDatetime) <= DAY(@endDatetime)
SET @startDatetime = DATEADD(M,DATEDIFF(M,@startDatetime,@endDatetime),@startDatetime)
ELSE
SET @startDatetime = DATEADD(M,DATEDIFF(M,@startDatetime,DATEADD(M,-1,@endDatetime)),@startDatetime)
SET @RETURN = DATEDIFF(D,@startDatetime,@endDatetime)
END
SELECT @RETURN
END
/*
EXEC getDateDiffKK 'Y','2013-08-23','2015-11-11'
EXEC getDateDiffKK 'M','2013-08-23','2015-11-11'
EXEC getDateDiffKK 'D','2013-08-23','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,@QSRQ,DATEADD(M,-1,@JSRQ)) end AS 月份数
,CASE WHEN DAY(@QSRQ) <= DAY(@JSRQ) THEN DATEDIFF(D,DATEADD(M,DATEDIFF(M,@QSRQ,@JSRQ),@QSRQ),@JSRQ)
ELSE DATEDIFF(D,DATEADD(M,DATEDIFF(M,@QSRQ,DATEADD(M,-1,@JSRQ)),@QSRQ),@JSRQ) end AS 天数
/*
结果:
月份数 天数
26 19
日期差26个月零19天
*/
--错误:
select DATEDIFF(M,@QSRQ,@JSRQ) --26
select DATEDIFF(D,@QSRQ,@JSRQ) --810
2016-08-30 补充 -------------------------------
ALTER FUNCTION DBO.getDateDiff(@startDate DATETIME,@endDate DATETIME)
RETURNS VARCHAR(10) --长度设置
AS
BEGIN
RETURN DATEDIFF(D,@startDate,@endDate)
END
GO
ALTER FUNCTION DBO.getDateDiff(@startDate DATETIME,@endDate DATETIME)
RETURNS INT --返回整形
AS
BEGIN
RETURN DATEDIFF(D,@startDate,@endDate)
END
GO
--存储过程:正确
ALTER PROCEDURE DBO.getDateDiffKK(@startDate DATETIME,@endDate DATETIME)
AS
BEGIN
SELECT DATEDIFF(D,@startDate,@endDate)
END
GO
--执行结果:
SELECT DBO.getDateDiff('2013-08-23','2015-11-11')
GO
EXEC DBO.getDateDiffKK '2013-08-23','2015-11-11'
GO