2017-02-27 97 views
0

我称之为表日期需要加入日期和今天的年,月,日格式日期间计算天的差异

Opendate  Closedate  
2016-02-26  NULL  
2017-01-01  NULL  
2015-11-11  NULL  

我想有输出

Opendate Workingperiod  
2016-02-26 1 years 0 months 1 days   
2017-01-01 0 years 1 months 26 days  
2015-11-27 1 years 3 months 0 days  

我们需要计算opendate和今天的日期之间的差异,以年份和日期格式。

是否有任何输入可以共享。

+2

这是SQL Server真正的痛苦。 –

回答

1
CREATE TABLE Dates(Opendate DATE, CloseDate DATE) 

INSERT INTO Dates(Opendate, CloseDate) values('2016-02-26', null),('2017-01-01',null),('2015-11-11',null) 

SELECT Opendate, 
     CASE WHEN DAY(Opendate)>DAY(GETDATE()) THEN 
     CAST(DATEDIFF(month,Opendate,GETDATE())/12 AS VARCHAR(5))+' year '+ 
     CAST((DATEDIFF(month,Opendate,GETDATE())%12-1) AS VARCHAR(5)) +' month '+ 
     CAST(DATEDIFF(day,DATEADD(month,DATEDIFF(month,Opendate,GETDATE())-1,Opendate),EOMONTH(DATEADD(month,-1,GETDATE())))+DAY(GETDATE()) AS VARCHAR(5))+' days ' 
     ELSE 
      CAST(DATEDIFF(month,Opendate,GETDATE())/12 AS VARCHAR(5))+' year '+ 
      CAST(DATEDIFF(month,Opendate,GETDATE())%12 AS VARCHAR(5)) +' month '+ 
      CAST(DATEDIFF(day,DATEADD(month,DATEDIFF(month,Opendate,GETDATE()),Opendate),GETDATE()) AS VARCHAR(5))+' days ' 
     END AS 'Workingperiod'  
    FROM Dates 

以上是我的剧本,希望你觉得它有用。

+0

Thanx @victor它像一个魅力炒作。 –

+0

我的荣幸红。 –

+0

Victor我有一个代码问题,当我的加入日期是2014-06-02 00:00:00时,我的输出为2年9个月-1天。我的日子是负的 –

1

我认为这应该工作 - 有点结合日期算术(我加入CURRENT_DATE以显示我们正在计算); WITH子句就是你显示的输入。

WITH 
input(Opendate,Closedate) AS (
      SELECT DATE '2016-02-26',NULL 
UNION ALL SELECT DATE '2017-01-01',NULL 
UNION ALL SELECT DATE '2015-11-11',NULL 
) 
SELECT 
    GETDATE() AS current_date 
, Opendate 
, CAST(DATEDIFF(MONTH, Opendate,GETDATE())/12 AS VARCHAR(3)) + ' years ' 
+ CAST(DATEDIFF(MONTH, Opendate,GETDATE()) % 12 AS VARCHAR(3)) + ' months ' 
+ CAST(
    DATEDIFF(
     DAY 
    , Opendate 
    , DATEADD(
     MONTH 
     , DATEDIFF(MONTH, Opendate,GETDATE()) * -1 
     , GETDATE() 
    ) 
    ) 
    AS VARCHAR(3) 
) + ' days' 
AS WorkingPeriod 
FROM input; 

current_date|Opendate |WorkingPeriod 
2017-02-26 |2016-02-26|1 years 0 months 0 days 
2017-02-26 |2017-01-01|0 years 1 months 25 days 
2017-02-26 |2015-11-11|1 years 3 months 15 days 
+0

Msg 156,Level 15,State 1,Line 11 关键字'CURRENT_DATE'附近的语法错误。 –

+0

无法对SQL服务器进行测试,而且我很惊讶SQL Server甚至不支持ANSI标准的CURRENT_DATE伪列。它是'GETDATE()'。我编辑了我的答案。 – marcothesane

+0

Msg 102,Level 15,State 1,Line 10 '|'附近语法不正确。 –