2017-02-27 6 views
0

Ich habe eine Tabelle namens Terminebenötigen zwischen Verbindungs ​​Datum und dem heutigen Datum im Jahr, Monat und Tag Format

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

Ich möchte haben die Ausgabe als

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  

Wir Differenz der Tage berechnen müssen den Unterschied zwischen dem geöffneten und dem heutigen Datum und dem Jahr, Monat und Tag berechnen.

Gibt es irgendwelche Eingänge, die Any1 teilen kann.

+2

Dies ist ein echter Schmerz in SQL Server. –

Antwort

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 

darüber mein Skript ist, hoffen, dass Sie es nützlich finden.

+0

Danke @victor es woks wie ein Charme. –

+0

mein Vergnügen Red. –

+0

Victor Ich habe 1 Problem mit dem Code, wenn mein Beitrittsdatum ist 2014-06-02 00:00:00, meine Ausgabe kommt als 2 Jahr 9 Monate -1 Tage. Meine Tage kommen in negative –

1

Ich denke, das sollte funktionieren - ein bisschen kombinierte Datumsarithmetik (ich addiere CURRENT_DATE, um zu zeigen, was wir berechnen); Die WITH-Klausel ist nur die Eingabe, die Sie gezeigt haben.

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

Nachricht 156, Ebene 15, Status 1, Zeile 11 Falsche Syntax in der Nähe des Schlüsselworts 'CURRENT_DATE'. –

+0

Konnte es nicht gegen SQL-Server testen, und ich bin überrascht, dass SQL Server nicht unterstützt die ANSI-Standard CURRENT_DATE Pseudospalte. Es ist stattdessen 'GETDATE()'. Ich habe meine Antwort bearbeitet. – marcothesane

+0

Msg 102, Ebene 15, Status 1, Zeile 10 Falsche Syntax in der Nähe von '|'. –

Verwandte Themen