I have two dates06-Jan-2009
and 12-Dec-2010
我有两个日期在2009年1月6日和2010年12月12日
I want to calculate the date difference between these two dates.. (basis on the month and year).
I want to get the answer 2 Year.
我想计算这两个日期之间的日期差异..(基于月份和年份)。我想得到答案2年。
But if dates is 06-Jan-2009
And 12-Oct-2010
then I need 10 Months as output.
但如果日期是2009年1月6日和2010年10月12日,那么我需要10个月作为输出。
6 个解决方案
#1
2
Try this one:
试试这个:
Declare @SDate DateTime ='06-Jan-2009'
Declare @EDate DateTime ='12-Oct-2009'
select case when DateDiff(M,@sDate,@EDate) <=12
then DateDiff(M,@sDate,@EDate)
else Round( ( Convert(Decimal(18,0)
,DateDiff(M,@sDate,@EDate)/12.0)),0) end
#2
1
declare @Birthdate datetime
declare @AsOnDate datetime
declare @years int
declare @months int
declare @days int
declare @hours int
declare @minutes int
--NOTE: date of birth must be smaller than As on date,
--else it could produce wrong results
set @Birthdate = '1989-11-30 9:27 pm' --birthdate
set @AsOnDate = Getdate() --current datetime
--calculate years
select @years = datediff(year,@Birthdate,@AsOnDate)
--calculate months if it's value is negative then it
--indicates after __ months; __ years will be complete
--To resolve this, we have taken a flag @MonthOverflow...
declare @monthOverflow int
select @monthOverflow = case when datediff(month,@Birthdate,@AsOnDate) -
( datediff(year,@Birthdate,@AsOnDate) * 12) <0 then -1 else 1 end
--decrease year by 1 if months are Overflowed
select @Years = case when @monthOverflow < 0 then @years-1 else @years end
select @months = datediff(month,@Birthdate,@AsOnDate) - (@years * 12)
--as we do for month overflow criteria for days and hours
--& minutes logic will followed same way
declare @LastdayOfMonth int
select @LastdayOfMonth = datepart(d,DATEADD
(s,-1,DATEADD(mm, DATEDIFF(m,0,@AsOnDate)+1,0)))
select @days = case when @monthOverflow<0 and
DAY(@Birthdate)> DAY(@AsOnDate)
then @LastdayOfMonth +
(datepart(d,@AsOnDate) - datepart(d,@Birthdate) ) - 1
else datepart(d,@AsOnDate) - datepart(d,@Birthdate) end
declare @hoursOverflow int
select @hoursOverflow = case when datepart(hh,@AsOnDate) -
datepart(hh,@Birthdate) <0 then -1 else 1 end
select @hours = case when @hoursOverflow<0 then 24 +
datepart(hh,@AsOnDate) - datepart(hh,@Birthdate)
else datepart(hh,@AsOnDate) - datepart(hh,@Birthdate) end
declare @minutesOverflow int
select @minutesOverflow = case when datepart(mi,@AsOnDate) -
datepart(mi,@Birthdate) <0 then -1 else 1 end
select @minutes = case when @hoursOverflow<0
then 60 - (datepart(mi,@AsOnDate) -
datepart(mi,@Birthdate)) else abs(datepart
(mi,@AsOnDate) - datepart(mi,@Birthdate)) end
select
@Months=case when @days < 0 or DAY(@Birthdate)> DAY(@AsOnDate) then @Months-1 else @Months end
Declare @lastdayAsOnDate int;
set @lastdayAsOnDate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@AsOnDate),0)));
Declare @lastdayBirthdate int;
set @lastdayBirthdate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@Birthdate)+1,0)));
if (@Days < 0)
(
select @Days = case when( @lastdayBirthdate > @lastdayAsOnDate) then
@lastdayBirthdate + @Days
else
@lastdayAsOnDate + @Days
end
)
print convert(varchar,@years) + ' year(s), ' +
convert(varchar,@months) + ' month(s), ' +
convert(varchar,@days) + ' day(s), ' +
convert(varchar,@hours) + ':' +
convert(varchar,@minutes) + ' hour(s)'
#3
0
Please tried with below query
请尝试以下查询
Declare @SDate DateTime ='01-Jan-2009'
Declare @EDate DateTime ='12-Oct-2009'
SET @EDate = DATEADD(M, 1, @EDate)
select DateDiff(M,@sDate,@EDate)
#4
0
select Round( (
Convert(Decimal(18,2),DateDiff(M,'06-Jan-2009','12-Dec-2010')/12.0)),0)
as Years
#5
0
I think that would be work for me:
我认为这对我有用:
DECLARE @start DATETIME='01-Jan-2008'
DECLARE @end DATETIME='10-Nov-2011'
DECLARE @duration INT
--SELECT @start = '2011-10-10', @end = '2013-10-10'
--select DATEPART(dd,@start)
SET @Start = Dateadd(DAY, -( Datepart(DD, @Start) - 1 ), @Start)
SET @end = Dateadd(DAY, -( Datepart(day, @end) - 1 ), @end)
SET @end = Dateadd(day, Day(Dateadd(mm, Datediff(mm, -1, @end), -1)), @end)
SELECT @duration = Datediff(mm, @Start, @end)
SELECT CASE
WHEN @duration = 0 THEN NULL
WHEN @duration%12 = 0 THEN( CONVERT(NVARCHAR, @duration / 12) + ' Year ' )
WHEN @duration > 12 THEN( CONVERT(NVARCHAR, @duration / 12) + ' Year ' + CONVERT(NVARCHAR, @duration % 12) + ' Month ' )
ELSE (SELECT CONVERT(NVARCHAR, @duration % 12) + ' Month')
END
#6
0
declare @Birthdate datetime
declare @AsOnDate datetime
declare @years varchar(4)
declare @months varchar(3)
declare @days varchar(3)
declare @hours varchar(3)
declare @minutes varchar(2)
set @Birthdate = '1989-11-30 9:27 AM' --birthdate
set @AsOnDate = getdate() --current datetime
select @years = datediff(year,@Birthdate,@AsOnDate)
select @months = datediff(month,@Birthdate,@AsOnDate) -
( datediff(year,@Birthdate,@AsOnDate) * 12)
select @days = datepart(d,@AsOnDate) - datepart(d,@Birthdate)
select @hours = datepart(hh,@AsOnDate) - datepart(hh,@Birthdate)
select @minutes = abs(datepart(mi,@AsOnDate) - datepart(mi,@Birthdate))
print @years + ' year(s), ' +
@months + ' month(s), ' +
@days + ' day(s), ' +
@hours + ':' + @minutes + ' hour(s)'
OUT PUT:
#1
2
Try this one:
试试这个:
Declare @SDate DateTime ='06-Jan-2009'
Declare @EDate DateTime ='12-Oct-2009'
select case when DateDiff(M,@sDate,@EDate) <=12
then DateDiff(M,@sDate,@EDate)
else Round( ( Convert(Decimal(18,0)
,DateDiff(M,@sDate,@EDate)/12.0)),0) end
#2
1
declare @Birthdate datetime
declare @AsOnDate datetime
declare @years int
declare @months int
declare @days int
declare @hours int
declare @minutes int
--NOTE: date of birth must be smaller than As on date,
--else it could produce wrong results
set @Birthdate = '1989-11-30 9:27 pm' --birthdate
set @AsOnDate = Getdate() --current datetime
--calculate years
select @years = datediff(year,@Birthdate,@AsOnDate)
--calculate months if it's value is negative then it
--indicates after __ months; __ years will be complete
--To resolve this, we have taken a flag @MonthOverflow...
declare @monthOverflow int
select @monthOverflow = case when datediff(month,@Birthdate,@AsOnDate) -
( datediff(year,@Birthdate,@AsOnDate) * 12) <0 then -1 else 1 end
--decrease year by 1 if months are Overflowed
select @Years = case when @monthOverflow < 0 then @years-1 else @years end
select @months = datediff(month,@Birthdate,@AsOnDate) - (@years * 12)
--as we do for month overflow criteria for days and hours
--& minutes logic will followed same way
declare @LastdayOfMonth int
select @LastdayOfMonth = datepart(d,DATEADD
(s,-1,DATEADD(mm, DATEDIFF(m,0,@AsOnDate)+1,0)))
select @days = case when @monthOverflow<0 and
DAY(@Birthdate)> DAY(@AsOnDate)
then @LastdayOfMonth +
(datepart(d,@AsOnDate) - datepart(d,@Birthdate) ) - 1
else datepart(d,@AsOnDate) - datepart(d,@Birthdate) end
declare @hoursOverflow int
select @hoursOverflow = case when datepart(hh,@AsOnDate) -
datepart(hh,@Birthdate) <0 then -1 else 1 end
select @hours = case when @hoursOverflow<0 then 24 +
datepart(hh,@AsOnDate) - datepart(hh,@Birthdate)
else datepart(hh,@AsOnDate) - datepart(hh,@Birthdate) end
declare @minutesOverflow int
select @minutesOverflow = case when datepart(mi,@AsOnDate) -
datepart(mi,@Birthdate) <0 then -1 else 1 end
select @minutes = case when @hoursOverflow<0
then 60 - (datepart(mi,@AsOnDate) -
datepart(mi,@Birthdate)) else abs(datepart
(mi,@AsOnDate) - datepart(mi,@Birthdate)) end
select
@Months=case when @days < 0 or DAY(@Birthdate)> DAY(@AsOnDate) then @Months-1 else @Months end
Declare @lastdayAsOnDate int;
set @lastdayAsOnDate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@AsOnDate),0)));
Declare @lastdayBirthdate int;
set @lastdayBirthdate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@Birthdate)+1,0)));
if (@Days < 0)
(
select @Days = case when( @lastdayBirthdate > @lastdayAsOnDate) then
@lastdayBirthdate + @Days
else
@lastdayAsOnDate + @Days
end
)
print convert(varchar,@years) + ' year(s), ' +
convert(varchar,@months) + ' month(s), ' +
convert(varchar,@days) + ' day(s), ' +
convert(varchar,@hours) + ':' +
convert(varchar,@minutes) + ' hour(s)'
#3
0
Please tried with below query
请尝试以下查询
Declare @SDate DateTime ='01-Jan-2009'
Declare @EDate DateTime ='12-Oct-2009'
SET @EDate = DATEADD(M, 1, @EDate)
select DateDiff(M,@sDate,@EDate)
#4
0
select Round( (
Convert(Decimal(18,2),DateDiff(M,'06-Jan-2009','12-Dec-2010')/12.0)),0)
as Years
#5
0
I think that would be work for me:
我认为这对我有用:
DECLARE @start DATETIME='01-Jan-2008'
DECLARE @end DATETIME='10-Nov-2011'
DECLARE @duration INT
--SELECT @start = '2011-10-10', @end = '2013-10-10'
--select DATEPART(dd,@start)
SET @Start = Dateadd(DAY, -( Datepart(DD, @Start) - 1 ), @Start)
SET @end = Dateadd(DAY, -( Datepart(day, @end) - 1 ), @end)
SET @end = Dateadd(day, Day(Dateadd(mm, Datediff(mm, -1, @end), -1)), @end)
SELECT @duration = Datediff(mm, @Start, @end)
SELECT CASE
WHEN @duration = 0 THEN NULL
WHEN @duration%12 = 0 THEN( CONVERT(NVARCHAR, @duration / 12) + ' Year ' )
WHEN @duration > 12 THEN( CONVERT(NVARCHAR, @duration / 12) + ' Year ' + CONVERT(NVARCHAR, @duration % 12) + ' Month ' )
ELSE (SELECT CONVERT(NVARCHAR, @duration % 12) + ' Month')
END
#6
0
declare @Birthdate datetime
declare @AsOnDate datetime
declare @years varchar(4)
declare @months varchar(3)
declare @days varchar(3)
declare @hours varchar(3)
declare @minutes varchar(2)
set @Birthdate = '1989-11-30 9:27 AM' --birthdate
set @AsOnDate = getdate() --current datetime
select @years = datediff(year,@Birthdate,@AsOnDate)
select @months = datediff(month,@Birthdate,@AsOnDate) -
( datediff(year,@Birthdate,@AsOnDate) * 12)
select @days = datepart(d,@AsOnDate) - datepart(d,@Birthdate)
select @hours = datepart(hh,@AsOnDate) - datepart(hh,@Birthdate)
select @minutes = abs(datepart(mi,@AsOnDate) - datepart(mi,@Birthdate))
print @years + ' year(s), ' +
@months + ' month(s), ' +
@days + ' day(s), ' +
@hours + ':' + @minutes + ' hour(s)'
OUT PUT: