我正在使用这个函数得到两个日期的差异,一个人的日期加入= 03/03 / 1993,日期剩余的日期是06/02/2012应该带回8年11个月,但在我的带来回到9年2个月我也需要它适应如果加入日期是在年份之后的年份,你需要减去一年。这几个月是相同的
ALTER FUNCTION [dbo].[hmsGetLosText]
(@FromDt as datetime,@DateLeftOrg as Datetime)
returns varchar(255)
as
BEGIN
DECLARE @yy AS SMALLINT, @mm AS INT, @dd AS INT,
@getmm as INT, @getdd as INT, @Fvalue varchar(255)
SET @DateLeftOrg = CASE WHEN @DateLeftOrg IS NULL THEN GetDate()
WHEN @DateLeftOrg = '1/1/1900' THEN GetDate()
ELSE @DateLeftOrg
END
SET @DateLeftOrg = CASE WHEN YEAR(@FromDt) > YEAR(@DateLeftOrg) THEN DateAdd(yy, -1, @DateLeftOrg)
else @DateLeftOrg
end
SET @yy = DATEDIFF(yy, @FromDt, @DateLeftOrg)
SET @mm = DATEDIFF(mm, @FromDt, @DateLeftOrg)
SET @dd = DATEDIFF(dd, @FromDt, @DateLeftOrg)
SET @getmm = ABS(DATEDIFF(mm, DATEADD(yy, @yy, @FromDt), @DateLeftOrg))
SET @getdd = ABS(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, DATEADD(yy, @yy, @FromDt), @DateLeftOrg), DATEADD(yy, @yy, @FromDt)), @DateLeftOrg))
IF @getmm = 1
set @getmm=0
RETURN (
Convert(varchar(10),@yy) + 'y ' + Convert(varchar(10),@getmm) + 'm ')
END
答案 0 :(得分:2)
这种情况正在发生,因为调用者在某处将字符串“03/03/1993”和“06/02/2012”转换为日期,而没有明确说明日期语义,并且月份和日期正在交换。
所以“03/03/1993”(巧合地)明确地表示为“1993-MAR-03”,但如果“06/02/2012”与“2012-FEB-06”相同,那么他们的差异是8年,11个月。但如果“06/02/2012”被解释为“2012-JUN-02”,则他们的差异是9年2个月。
要解决此问题,调用者应使用不太模糊的格式,例如“2012-02-06”(始终是2月6日)或明确限定并转换它。这就是你在T-SQL中的表现:
SELECT @date = CONVERT(DATETIME, '06/02/2012', 103)
也总是被解释为2月6日。
答案 1 :(得分:1)
只需这样就可以获得delta:
DECLARE @Delta DATETIME
SET @Delta = @End - @Start
所以,如果你期待8年,那么@Delta年将是1908年,那么你将获得@Delta的月份,即日,小时,分钟。等....
答案 2 :(得分:0)
这就是我得到你想要的答案的方法:
DECLARE @D DATETIME
SET @D = CONVERT(datetime,'06/02/2002', 103) - CONVERT(datetime,'03/03/1993', 103)
SELECT @D
SELECT DATEPART(yyyy,@D) - 1900
SELECT DATEPART(mm,@D) - 1
SELECT DATEPART(day,@D) - 1