Sql 返回怪异日期函数以计算服务长度
我下面的函数是为一些日期而不是其他日期工作的,因为某些原因,例如365天等,它的打印时间减去年份Sql 返回怪异日期函数以计算服务长度,sql,sql-server,sql-function,Sql,Sql Server,Sql Function,我下面的函数是为一些日期而不是其他日期工作的,因为某些原因,例如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, @From
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
我将使用:
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(year,'20121231','20130101')
返回1(就像DATEDIFF(year,'20120101','20131231')
)。根据它自己的定义,这是正确的。但是,如果我们将该值加回到两个日期中较早的日期上,我们需要一个永远不会超调的值,因此我们必须通过有时减去1来进行补偿。您能给出一些日期行为不正确的例子(以及一些情况下的例子)吗月加31天这导致它少了一天我以为.net中的dateiff会正确处理这个问题,但似乎不是设置@DY
中的*-1
对DATEDIFF
做了什么?但是如果你有人在2013年10月20日,并且你从2013年11月5日开始计算,它应该返回0年0个月16天上述情况并非如此