2017-02-22 3 views
0

Ich versuche herauszufinden, wie lange Mitarbeiter für das Unternehmen gearbeitet haben und ich sollte auch herausfinden, ob einer der Mitarbeiter ein Rücktrittsdatum haben.Konvertierung fehlgeschlagen beim Konvertieren des Varchar-Wertes '2 Jahr -2 Monat 21 Tage' in den Datentyp Int

Aber ich habe gerade keine Daten dafür, daher ist der Wert dieser Spalte in meiner Datenbank Null. Aber ich denke in meinem sql, wenn es passiert ist, nehmen Resignation Date statt der aktuellen Zeit aber jetzt nehmen Sie das Startdatum der Arbeit und die aktuelle Zeit. Meine Theorie ist, wenn die Spalte Resignation Datum ist Null, nehmen Sie "Aktuelles Datum - Arbeit Startdatum", sonst sollte es Rücktrittsdatum - Startdatum der Arbeit.

Ich schrieb eine SQL-Abfrage für diese Theorie und es funktioniert gut, aber wenn ich versuche Rückkehr für Ex Jahr Monat Tag für wie lange Arbeits Mitarbeiter habe ich ein Problem, das ist:

a) ich mit diesem Fehler rang nach Stunden und ich habe auch versucht, diese Zeilen zu konvertieren, ich dachte, seine umgewandelt werden sollte, aber es ist nicht gut so arbeiten, als ich meine Haupt-Abfrage ausführen, bekomme ich diesen Fehler:

> Msg 245, Level 16, State 1, Line 1 
> Conversion failed when converting the varchar value '2 year -2 month 21 day' to data type int. 

Meine Haupt Abfrage wie folgt aussieht:

**--- sql for how long employees work with year month day ----** 
    CASE 
     WHEN Users.ResignationDate IS NOT NULL 
      THEN DATEDIFF(YEAR, WorkStartDate, ResignationDate) 
      ELSE CAST(DATEDIFF(yy, WorkStartDate, GETDATE()) AS varchar(4)) + ' year ' + 
       CAST(DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()) AS varchar(2)) + ' month ' + 
       CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()), DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate)), GETDATE()) AS varchar(2)) +' day' END as Ancinitet, 
     Paychecks.DepartmentName AS Afdelinger 
    FROM dbo.Paychecks INNER JOIN dbo.Users ON Users.Id=Paychecks.UserId 
WHERE Users.CustomerId=214 order by Users.FirstName; 
+0

Ich würde vorschlagen, die Abfrage zu vereinfachen, das Problem zu isolieren. –

+0

ich habe gerade die Abfrage bearbeitet, bitte sehen Sie, wenn nicht ok, sagen Sie mir – RyaN

+0

warum Sie unterschiedliche Ergebnisse für beide Fälle zeigen - Wenn das Rücktrittsdatum nicht null ist, verwenden Sie datediff und wenn null ist, dann fügen Sie Jahr hinzu, Monat und Tage in Ihrer Ausgabe. –

Antwort

1

Ein case Ausdruck gibt einen einzelnen Wert zurück - und einen einzigen Typ. Ihr gibt zwei verschiedene Typen zurück, und SQL Server entscheidet, dass der entsprechende Rückgabetyp der erste ist, eine Ganzzahl.

werfen Sie einfach auf einen String:

(CASE WHEN Users.ResignationDate IS NOT NULL 
     THEN CAST(DATEDIFF(YEAR, WorkStartDate, ResignationDate) as VARCHAR(255)) 
     ELSE (CAST(DATEDIFF(year, WorkStartDate, GETDATE()) AS varchar(4)) +' year ' + 
      CAST(DATEDIFF(month, DATEADD(year, DATEDIFF(year, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()) AS varchar(2)) +' month ' + 
      CAST(DATEDIFF(day, DATEADD(month, DATEDIFF(month, DATEADD(year, DATEDIFF(year, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()), DATEADD(year, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate)), GETDATE()) AS varchar(2)) +' day' 
     ) 
END) as Ancinitet, 

Ich vermute, dass es einen besseren Weg, was Sie wollen zu tun ist. Wenn das von Interesse ist, fragen Sie eine andere Frage mit Beispieldaten und gewünschten Ergebnissen.

+0

Ich habe nur den Code ersetzt, Sie haben es geschrieben, aber ich bekomme diesen Fehler: Msg 241, Level 16, State 1, Zeile 1 Konvertierung fehlgeschlagen, wenn Datum und/oder Uhrzeit aus Zeichenkette konvertiert werden. – RyaN

+1

Was ist der Datentyp von 'WorkStartDate'? –

+0

Datentyp ist Datetime – RyaN

0

Was ist daran falsch?

datediff(year, workStartDate, isNull(resignationDate, getDate())) 
+0

nichts falsch damit, ich will nur meine out Put so aussehen für ex, 2 Jahre 2 Monate 2 Tage – RyaN

0

Es wäre besser, Wochen statt Monate zu verwenden, da eine Woche immer 7 Tage enthält. Sie können auch einen 30-Tage-Monat nutzen, der Ihnen in der Regel nahe kommt, aber Ihre Tage können von einem Paar aus sein.

DECLARE @StartDate DATETIME = '20151115', 
     @EndDate DATETIME = GETDATE(); 

SELECT YearWeekDay = CONCAT(DATEDIFF(DAY, @StartDate, @EndDate)/365, ' year ', DATEDIFF(DAY, @StartDate, @EndDate) % 365/7, ' week ', 
           DATEDIFF(DAY, @StartDate, @EndDate) % 365 % 7, ' day' 
          ), 
     YearMonthDay = CONCAT(DATEDIFF(DAY, @StartDate, @EndDate)/365, ' year ', DATEDIFF(DAY, @StartDate, @EndDate) % 365/30, ' month ', 
           DATEDIFF(DAY, @StartDate, @EndDate) % 365 % 30, ' day ' 
          ), 
     YWDHMS = CONCAT(DATEDIFF(SECOND, @StartDate, @EndDate)/86400/365, 'y ', DATEDIFF(SECOND, @StartDate, @EndDate)/86400 % 365/7, 'w ', 
         DATEDIFF(SECOND, @StartDate, @EndDate)/86400 % 365 % 7, 'd ', DATEDIFF(SECOND, @StartDate, @EndDate) % 86400/3600, 'h ', 
         DATEDIFF(SECOND, @StartDate, @EndDate) % 3600/60, 'm ', DATEDIFF(SECOND, @StartDate, @EndDate) % 60, 's ' 
         ); 

Ausgang:

StartDate EndDate     YearWeekDay    YearMonthDay   YWDHMS 
2015-11-15 2017-02-22 15:11:34.123 1 year 14 week 2 day 1 year 3 month 10 day 1y 14w 2d 15h 11m 34s 
+0

@RyaN Ihre angenommene Antwort gibt "2 Jahr -9 Monat 8 Tage" für den 15.11.2015 zurück. Wolltest du das? Meine Antwort gibt "1 Jahr 3 Monate 10 Tage" oder "1 Jahr 14 Wochen 2 Tage" zurück. –

Verwandte Themen