2008-09-17 50 views
5

Tôi có một bảng trong cơ sở dữ liệu của mình các bản ghi bắt đầu và dừng thời gian cho một tác vụ cụ thể. Dưới đây là một mẫu của các dữ liệu:Transact-SQL để tổng hợp thời gian đã trôi qua

Start      Stop 
9/15/2008 5:59:46 PM  9/15/2008 6:26:28 PM 
9/15/2008 6:30:45 PM  9/15/2008 6:40:49 PM 
9/16/2008 8:30:45 PM  9/15/2008 9:20:29 PM 
9/16/2008 12:30:45 PM  12/31/9999 12:00:00 AM 

Tôi muốn viết một kịch bản mà tổng số lên phút trôi qua đối với những khung thời gian, và bất cứ nơi nào có một ngày 12/31/9999, tôi muốn nó sử dụng ngày và giờ hiện tại, vì điều này vẫn đang diễn ra.

Làm cách nào để thực hiện điều này bằng Transact-SQL?

Trả lời

11
SELECT SUM(CASE WHEN Stop = '31 dec 9999' 
        THEN DateDiff(mi, Start, Stop) 
        ELSE DateDiff(mi, Start, GetDate()) 
      END) AS TotalMinutes 
FROM task 

Tuy nhiên, một giải pháp tốt hơn là nên làm cho Dừng lĩnh vực nullable , và làm cho nó null khi nhiệm vụ vẫn chạy. Bằng cách đó, bạn có thể làm điều này:

SELECT SUM(DateDiff(mi, Start, IsNull(Stop, GetDate())) AS TotalMinutes 
FROM task 
0

datediff function có thể hiển thị số phút đã trôi qua. Các câu lệnh if cho việc kiểm tra 12/31/9999 Tôi sẽ để lại như một excercise cho người đọc ;-)

0

--Bạn có thể chơi với các datediff sử dụng mi phút

- điều này cung cấp cho bạn thứ hai của mỗi công việc

select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable 

- tổng

Select Sum(duration_in_seconds) 
from 
(
select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable)x 
0

datediff trở nên khó khăn hơn để sử dụng như bạn có nhiều dateparts trong sự khác biệt của bạn (ví dụ trong trường hợp của bạn, có vẻ như phút và giây; thỉnh thoảng giờ). May mắn thay, trong hầu hết các biến thể của TSQL, bạn chỉ có thể thực hiện toán học vào các ngày tháng. Giả sử đây là một lĩnh vực ngày, bạn có thể có lẽ chỉ truy vấn:

chọn Thời lượng = ngừng - bắt đầu

Đối với một ví dụ thực tế, chúng ta hãy chọn sự khác biệt giữa hai datetimes mà không làm phiền với một bảng:

chọn chuyển đổi (datetime, '2008-09-17 04: 56: 45.030') - chuyển đổi (datetime, '2008-09-17 04: 53: 05.920')

trả về "1900-01-01 00:03 : 39.110 ", cho biết không có năm/tháng/ngày; 3 phút, 39,11 giây giữa hai thời gian này. Từ đó, mã của bạn có thể TimeSpan.Parse giá trị này.

2

Hãy thử:

Select Sum(
    DateDiff(
     Minute, 
     IsNull((Select Start where Start != '9999.12.31'), GetDate()), 
     IsNull((Select End where End != '9999.12.31'), GetDate()) 
    ) 
) 
from *tableName* 
1

Sau đây sẽ làm việc cho SQL Server, cơ sở dữ liệu khác sử dụng các chức năng khác nhau để tính ngày và nhận được thời gian hiện tại.

Select Case When (Stop <> '31 Dec 9999') Then 
      DateDiff(mi, Start, Stop) 
     Else 
      DateDiff(mi, Start, GetDate()) 
     End 
From ATable 
0

Sử dụng sự giúp đỡ từ AJ của answer, BelowNinety của answer và Nerdfest của answer, tôi đã đưa ra như sau:

Select Sum(
    Case When End = '12/31/9999 12:00:00 AM' Then 
     DateDiff(mi, Start, Getdate()) 
    Else 
     DateDiff(mi, Start, End) 
    End) As ElapsedTime 
From Table 

Thanks for the help!

3

Tôi nghĩ rằng điều này sạch hơn:

SELECT SUM(
       DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate())) 
      ) AS ElapsedTime 
    FROM Table 
Các vấn đề liên quan