2013-05-30 2 views
4

У меня есть таблица следующимСложите колонки Время с помощью SQL-запроса

repID ClockIn  ClockOut TotalHours 
109145 7:50:50 AM 3:37:16 PM 7:46:26 
109145 7:52:41 AM 3:44:51 PM 7:52:10 
109145 8:42:40 AM 3:46:29 PM 7:3:49 
109145 7:50:52 AM 3:42:59 PM 7:52:7 
109145 8:09:23 AM 3:36:55 PM 7:27:32 

Вот TotalHours 'столбец получается как дифф из ClockIn и ClockOut

Теперь мне нужно добавить все данные в столбце 'TotalHours' Чей тип данных в (varchar).

Как я должен добавить этот столбец .....

Я попытался, как

select SUM(TotalHours) 

Но он возвращает ошибку:

Operand data type varchar is invalid for sum operator

Я также попытался с приведения его в float , datetime и time ...

Но все возвращается ошибка ...

Пожалуйста, помогите суммировать столбец времени ....

ответ

0

Попробуйте следующее:

select sum(datediff(minute, 0, TotalHours))/60.0 as hours_worked 
+0

Спасибо за ответ .. Но это тоже возвращает ошибку как «Операнд типа данных дата и время недопустима для суммы оператора» – Renuka

+0

ожидания. Я позабочусь об этом. – Freelancer

+0

@ Renuka посмотреть мое редактирование. Она будет работать – Freelancer

0

Try:

select sum(datediff(s,ClockIn,ClockOut)) 

- чтобы получить результат в секундах.

+0

Привет ... Он возвращает датировку каждой строки ... Но я хочу, чтобы сумма всех данных в столбце «TotalHours» – Renuka

+0

@Renuka: Они должны быть одинаковыми, поскольку TotalHours - это разница во времени между ClockIn и Часы из. –

+0

Спасибо ... Это работает ... Я сделал ошибку в заявлении группы ... Спасибо за помощь ур – Renuka

4

SQL Fiddle

сервера Настройка MS SQL 2008 схемы:

CREATE TABLE Table2 
    ([repID] int, [ClockIn] datetime, [ClockOut] datetime, [TotalHours] varchar(7)) 
; 

INSERT INTO Table2 
    ([repID], [ClockIn], [ClockOut], [TotalHours]) 
VALUES 
    (109145, '7:50:50 AM', '3:37:16 PM', '7:46:26'), 
    (109145, '7:52:41 AM', '3:44:51 PM', '7:52:10'), 
    (109145, '8:42:40 AM', '3:46:29 PM', '7:3:49'), 
    (109145, '7:50:52 AM', '3:42:59 PM', '7:52:7'), 
    (109145, '8:09:23 AM', '3:36:55 PM', '7:27:32') 
; 

Запрос 1:

SELECT convert(varchar(8), dateadd(second, SUM(DATEDIFF(SECOND, ClockIn, ClockOut)), 0), 108) 
from Table2 
group by repID 

Results:

| COLUMN_0 | 
------------ 
| 14:02:04 | 

Запрос 2:

select sum(datediff(second,ClockIn,ClockOut))/3600 as hours_worked 
from Table2 

Results:

| hours_worked| 
------------ 
|  38 | 

Запрос 3:

select sum(datediff(minute, 0, TotalHours))/60.0 as hours_worked 
from Table2 

Results:

| HOURS_WORKED | 
---------------- 
|   38 | 

Здесь последний запрос был взят из фрилансеров ответа, как я был готов, чтобы узнать, работает ли он или нет.

Здесь сначала нужно преобразовать разницу в времени и времени в секунду или минуту, а затем преобразовать это время обратно в час.

Надеюсь, это поможет.

+0

Он отлично работает ... Спасибо за помощь ур – Renuka

+0

Этот запрос возвращает 38.00 .... Как получить точное значение как HH: MM – Renuka

+0

@Renuka: в этом случае вы должны рассмотреть первый запрос. Поскольку часы составляют 38, на следующий день так, что он показывает 14:02:04 – ankurtr

3

Поскольку TotalHours - это varchar, нам нужно сначала преобразовать его во времени. Попробуйте следующий код

select sum(datediff(minute,'0:00:00',CONVERT(time,TotalHours)))/60.0 as TotalHoursWorked 

Один из способов, чтобы получить выход в ЧЧ: ММ -

select left(right(convert(varchar(20),cast(sum(datediff(minute,'0:00:00',CONVERT(datetime,TotalHours)))/86400.0 as datetime)),8),6) 
+0

Он отлично работает ... Спасибо за помощь ур – Renuka

+0

Этот запрос возвращает 38.00 .... Как получить точное значение как HH: MM – Renuka

0

Я знаю, что этот вопрос является старым, но я нашел лучший вариант для этого. Попробуйте это:

select cast(sum(datediff(second,0,dt))/3600 as varchar(12)) + ':' + 
     right('0' + cast(sum(datediff(second,0,dt))/60%60 as varchar(2)),2) + 
     ':' + right('0' + cast(sum(datediff(second,0,dt))%60 as varchar(2)),2) 
from TestTable 
Смежные вопросы