2013-08-14 32 views
7

Tôi đang phải đối mặt với một vấn đề trong việc tìm kiếm tổng các giá trị được lưu trữ trong một cột,Làm thế nào để có được số tiền của lĩnh vực thời gian trong SQL server 2008

Tôi có một bảng như thế này:

gs_cycle_no | from_time | to_time | total_hours(varchar) ... 
GSC-334/2012 | 13:00  | 7:00  | 42:00 
GSC-334/2012 | 8:30  | 3:45  | 6:00 
. 
. 
. 

gì tôi cần tìm là nhóm Sum(total_hours) theo số gs_cycle_no. Nhưng phương pháp Sum sẽ không hoạt động trên các cột VARCHAR và tôi cũng không thể chuyển nó sang thập phân do định dạng của nó,

Làm thế nào tôi có thể tìm ra sum của total_hours cột, dựa trên gs_cycle_no?

+1

giá trị '42: 00' là gì? 42 giờ và 0 phút? – GolfWolf

Trả lời

5

nếu bạn không có phút và chỉ vài giờ, sau đó bạn có thể làm một cái gì đó như:

select 
    cast(sum(cast(replace(total_hours, ':', '') as int)/100) as nvarchar(max)) + ':00' 
from Table1 
group by gs_cycle_no 

nếu bạn không, hãy thử này:

with cte as 
(
    select 
     gs_cycle_no, 
     sum(cast(left(total_hours, len(total_hours) - 3) as int)) as h, 
     sum(cast(right(total_hours, 2) as int)) as m 
    from Table1 
    group by gs_cycle_no 
) 
select 
    gs_cycle_no, 
    cast(h + m/60 as nvarchar(max)) + ':' + 
    right('00' + cast(m % 60 as nvarchar(max)), 2) 
from cte 

sql fiddle demo

+0

đầu tiên một công việc chỉ cho toàn bộ giờ như bằng văn bản, bỏ lỡ nhóm theo thứ hai, nhờ đó –

+0

72:25 - xem http://sqlfiddle.com/#!3/b81ab/1 –

+0

@OzrenTkalcecKrznaric làm thế nào bạn kiểm tra điều đó? :) –

0

Truy vấn này tìm số tiền tính theo phút:

SQLFiddle demo

select gs_cycle_no, 

    SUM(
    CAST(
    ISNULL(
    substring(total_hours,1,CHARINDEX(':',total_hours)-1) 
    ,'0') as INT) * 60 
    + 
    CAST(
    ISNULL(
    substring(total_hours,CHARINDEX(':',total_hours)+1,100) 
    ,'0') as INT) 
    ) 
    from t 
group by gs_cycle_no 
+0

Kết quả đầu ra resultset, thay vì giờ – OzrenTkalcecKrznaric

0

Đây là giải pháp mà tôi phá vỡ varchar thành hai mảnh nhỏ, giờ và phút, và sau đó lập biên bản từ họ, và cuối cùng, số tiền họ:

SELECT 
    gs_cycle_no, 
    CAST(SUM(
     SUBSTRING(total_hours,0 ,CHARINDEX(':', total_hours)) * 60 + 
     SUBSTRING(total_hours, CHARINDEX(':', total_hours) + 1, LEN(total_hours)))/60 AS VARCHAR) + ':' + 
    CAST(SUM(
     SUBSTRING(total_hours,0 ,CHARINDEX(':', total_hours)) * 60 + 
     SUBSTRING(total_hours, CHARINDEX(':', total_hours) + 1, LEN(total_hours))) % 60 AS VARCHAR) 
FROM Table1 
GROUP BY gs_cycle_no 
1

này sẽ làm việc:

;with times as (
    select gs_cycle_no = 'GSC-334/2012', total_hours = '8:35' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '5:00' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '16:50' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '42:00' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '0:00' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '175:52' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '12:25') 
SELECT 
    gs_cycle_no, 
    hrs = sum(mins)/60 + sum(hrs), 
    mins = sum(mins) % 60 
FROM 
    TIMES 
    cross apply(
     select c = charindex(':', total_hours) 
    ) idx 
    cross apply(
     select 
      hrs = cast(substring(total_hours, 1, c - 1) as int), 
      mins = cast(substring(total_hours, c + 1, len(total_hours)) as int) 
    ) ext 
group by gs_cycle_no 
order by gs_cycle_no 
Các vấn đề liên quan