2017-02-22 11 views
0

Я пытаюсь выяснить, как долго сотрудники работают в компании, и я также должен выяснить, не работает ли какой-либо из сотрудников иметь дату отставки.Конверсия не удалась при преобразовании значения varchar '2 year -2 month 21 day' в тип данных int

Но у меня нет данных для этого прямо сейчас, поэтому значение этого столбца в моей базе данных Null. Но я считаю, что в моем sql, когда это произошло, вместо Date Date вместо Date Date, но теперь наберите дату начала работы и текущее время. моя теория заключается в том, что если дата отставки столбца равна нулю, возьмите «Текущая дата - дата начала работы», иначе , если она займет отставку - дата начала работы.

Я написал запрос SQL для этой теории, и она работает нормально, но когда я попытался возвращение на экс год месяц день, как долго сотрудников, работающих у меня есть проблема, которая:

а) Я боролся с этой ошибкой для часов, и я также попытался преобразовать эти строки, я думал, что его следует преобразовать, но это не работает хорошо, поэтому, когда я запускаю мой главный запрос, я получаю эту ошибку:

> 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. 

Мой главный запрос выглядит следующим образом:

**--- 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

Я хотел бы предложить упростить запрос, чтобы локализовать проблему. –

+0

Я только что отредактировал запрос, пожалуйста, посмотрите, если это не так, скажите мне – RyaN

+0

, почему вы показываете разные результаты для обоих случаев. Если дата отставки не равна нулю, вы используете датифик, а когда равно null, то вы добавляете год, месяц и дни на выходе. –

ответ

1

A case выражение возвращает одно значение - и один тип. Yours возвращает два разных типа, и SQL Server решает, что соответствующий тип возврата является первым, целым числом.

Просто бросить в строку:

(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, 

Я подозреваю, что есть лучший способ сделать то, что вы хотите. Если это интересного вопроса, задайте еще один вопрос: вопрос с примерными данными и желаемыми результатами.

+0

Я просто заменил код, вы написали его, но я получаю эту ошибку: Msg 241, Level 16, State 1, строка 1 Конверсия не удалась при преобразовании даты и/или времени из символьной строки. – RyaN

+1

Каков тип данных 'WorkStartDate'? –

+0

тип данных datetime – RyaN

0

Что случилось с этим?

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

ничего плохого в этом, я просто хочу, чтобы мой внешний вид выглядел так, например, для ex, 2 года 2 месяца 2 дня – RyaN

0

Вам будет лучше использовать недели вместо месяцев, так как неделя всегда содержит 7 дней. Вы также можете использовать 30-дневный месяц, который, как правило, приближает вас, но ваши дни могут быть отключены парой.

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 ' 
         ); 

Выход:

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 Ваш принятый ответ возвращает «2 год -9 месяцев 8 дней» для 15.11.2015. Это то, что вы хотели? Мой ответ возвращает «1 год 3 месяца 10 дней» или «1 год 14 недели 2 дня». –