【问题标题】:How to got difference between 2 date in Years ,Month , Days is sql [duplicate]如何在年,月,日中获得2个日期之间的差异是sql [重复]
【发布时间】:2017-10-03 19:08:25
【问题描述】:

我想得到年、月、日中 2 个日期之间的差异

示例: 入职日期 : 25/7/1998 当前日期:2017 年 9 月 30 日

结果如下:19 年 - 2 个月 - 11 天

【问题讨论】:

  • 为什么你的采样日期是 11 天?

标签: sql sql-server tsql


【解决方案1】:

如果您对表值函数持开放态度。这种方法非常精确和高效。您永远不必担心各种日期计算。

示例或dbFiddle

Declare @YourTable table (ID int, hiredate date)
Insert Into @YourTable values
(1,'1998-7-25')

Select A.ID
      ,B.*
 From @YourTable A
 Cross Apply [dbo].[tvf-Date-Elapsed](A.HireDate,GetDate()) B

返回(您可以忽略或省略小时、分钟和秒)

ID  Years   Months  Days    Hours   Minutes Seconds
1   19      2       8       15      21      47

有兴趣的UDF

CREATE FUNCTION [dbo].[tvf-Date-Elapsed] (@D1 DateTime,@D2 DateTime)
Returns Table
Return (
    with cteBN(N)   as (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
         cteRN(R)   as (Select Row_Number() Over (Order By (Select NULL))-1 From cteBN a,cteBN b,cteBN c),
         cteYY(N,D) as (Select Max(R),Max(DateAdd(YY,R,@D1))From cteRN R Where DateAdd(YY,R,@D1)<=@D2),
         cteMM(N,D) as (Select Max(R),Max(DateAdd(MM,R,D))  From (Select Top 12 R From cteRN Order By 1) R, cteYY P Where DateAdd(MM,R,D)<=@D2),
         cteDD(N,D) as (Select Max(R),Max(DateAdd(DD,R,D))  From (Select Top 31 R From cteRN Order By 1) R, cteMM P Where DateAdd(DD,R,D)<=@D2),
         cteHH(N,D) as (Select Max(R),Max(DateAdd(HH,R,D))  From (Select Top 24 R From cteRN Order By 1) R, cteDD P Where DateAdd(HH,R,D)<=@D2),
         cteMI(N,D) as (Select Max(R),Max(DateAdd(MI,R,D))  From (Select Top 60 R From cteRN Order By 1) R, cteHH P Where DateAdd(MI,R,D)<=@D2),
         cteSS(N,D) as (Select Max(R),Max(DateAdd(SS,R,D))  From (Select Top 60 R From cteRN Order By 1) R, cteMI P Where DateAdd(SS,R,D)<=@D2)

    Select [Years]   = cteYY.N
          ,[Months]  = cteMM.N
          ,[Days]    = cteDD.N
          ,[Hours]   = cteHH.N
          ,[Minutes] = cteMI.N
          ,[Seconds] = cteSS.N
          --,[Elapsed] = Format(cteYY.N,'0000')+':'+Format(cteMM.N,'00')+':'+Format(cteDD.N,'00')+' '+Format(cteHH.N,'00')+':'+Format(cteMI.N,'00')+':'+Format(cteSS.N,'00')
     From  cteYY,cteMM,cteDD,cteHH,cteMI,cteSS
)
--Max 1000 years
--Select * from [dbo].[tvf-Date-Elapsed] ('1991-09-12 21:00:00.000',GetDate())
--Select * from [dbo].[tvf-Date-Elapsed] ('2017-01-01 20:30:15','2018-02-05 22:58:35')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2013-07-23
    • 2014-04-07
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多