用于查找日期范围长度的函数

时间:2014-01-06 14:23:37

标签: sql sql-server user-defined-functions

我正在使用这个函数得到两个日期的差异,一个人的日期加入= 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

3 个答案:

答案 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