0

我下面的功能适用于某些日期,但不适用于某些日期,由于某种原因,它的打印减去年份,即 365 天等。

ALTER FUNCTION [dbo].[hmsGetLosText](@FromDt as datetime) returns varchar(255)
as

BEGIN
DECLARE @YRS AS SMALLINT, @MNT AS SMALLINT, @DY AS SMALLINT, @Fvalue varchar(255)

SET @YRS = DATEDIFF(YY, @FromDt,GETDATE())
SET @MNT = DATEDIFF(MM, @FromDt,GETDATE()) % 12
SET @DY = (DATEDIFF(DD,GETDATE(), DATEADD(MM, (@YRS * 12) + @MNT,@FromDt) )*-1)


SET @Fvalue = CAST(@YRS AS VARCHAR) + ' y ' + CAST(@MNT AS VARCHAR) + ' m ' + CAST(@DY AS VARCHAR) + ' d '
RETURN @Fvalue
4

1 回答 1

2

我会使用:

set @YRS = DATEDIFF(year,@FromDt,GETDATE()) +
        CASE WHEN DATEADD(year,DATEDIFF(year,@FromDt,GETDATE()),@FromDt) > GETDATE()
             THEN -1 ELSE 0 END
set @FromDt = DATEADD(year,@YRS,@FromDt)

set @MNT = DATEDIFF(month,@FromDt,GETDATE()) +
        CASE WHEN DATEADD(month,DATEDIFF(month,@FromDt,GETDATE()),@FromDt) > GETDATE()
             THEN -1 ELSE 0 END
set @FromDt = DATEADD(month,@MNT,@FromDt)

set @DY = DATEDIFF(day,@FromDt,GETDATE())

对我来说,这些更容易理解——我们首先得到一个我们满意的年份值,然后将其添加到@FromDt. 然后我们可以直接DATEDIFF做几个月,而不用大惊小怪地做模运算。同样,一旦我们对月份值感到满意,我们就会@FromDt再次调整,以便简单DATEDIFF地为我们提供正确的天数。

(您可以通过先设置然后确定是否调整它来消除一些进一步的计算@YRS,但不确定是否需要这里)


我们必须稍微摆弄才能获得正确的@YRS@MNT的原因是DATEDIFF

返回在指定startdateenddate之间交叉的指定datepart边界的计数(有符号整数)。

也就是说,DATEDIFF(year,'20121231','20130101')返回 1(和 一样DATEDIFF(year,'20120101','20131231'))。根据其自己的定义,这是正确的。但是,如果我们将该值添加回两个日期中较早的日期,我们想要一个永远不会超调的值 - 所以我们有时必须通过减去 1 来补偿。

于 2013-11-05T15:00:17.880 回答