2012-03-15 14 views
19

में समय फ़ील्ड को समेट कैसे करें मेरे पास "WrkHrs" नामक एक कॉलम है और डेटा प्रकार समय (एचएच: मिमी: एसएस) है। मैं कर्मचारियों के लिए कामकाजी घंटों को जोड़ना चाहता हूं। लेकिन चूंकि यह समय डेटा प्रकार एसक्यूएल सर्वर मुझे sum(columnname) जैसे उपयोग करने की अनुमति नहीं देता है।SQL सर्वर

मैं एसक्यूएल क्वेरी में समय डेटा प्रकार को कैसे जोड़ सकता हूं?

+2

और आप 'INT' या' NUMERIC' के बजाय इसके लिए 'TIME' का उपयोग क्यों कर रहे हैं? चूंकि डेटा 'TIME' है, इसलिए जब आप एकत्रित होने वाले कार्य घंटों को 24 से अधिक होते हैं, तो आपकी क्वेरी वापस क्या होनी चाहिए ?, परिणाम एक 'आईएनटी' होना चाहिए? – Lamak

+0

... या दो अलग कॉलम। –

+0

@ लामाक हां मुझे लगता है कि मैं संख्यात्मक डेटा प्रकार का भी उपयोग कर सकता हूं। मेरे लिए यह आसान होगा। – Sas

उत्तर

21
SELECT EmployeeID, minutes_worked = SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs)) 
FROM dbo.table 
-- WHERE ... 
GROUP BY EmployeeID; 

आप इसे सामने के अंत में सुंदर बना सकते हैं। या T-SQL में:

;WITH w(e, mw) AS 
(
    SELECT EmployeeID, SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs)) 
    FROM dbo.table 
    -- WHERE ... 
    GROUP BY EmployeeID 
) 
SELECT EmployeeID = e, 
    WrkHrs = RTRIM(mw/60) + ':' + RIGHT('0' + RTRIM(mw%60),2) 
    FROM w; 

हालांकि, आप गलत डेटा प्रकार का उपयोग कर रहे हैं। TIME का उपयोग समय में एक बिंदु को इंगित करने के लिए किया जाता है, अंतराल या अवधि नहीं। क्या उनके काम के घंटों को दो अलग-अलग कॉलम, StartTime और EndTime में स्टोर करने का अर्थ नहीं होगा?

+0

मैंने दो कॉलमों की कोशिश की, लेकिन समस्या टाइमिफ़ फ़ंक्शन की गणना घंटों या मिनटों के बीच भिन्न होती है, लेकिन एक साथ नहीं। मुझे एक साथ घंटे और मिनट की गणना करने का कोई तरीका नहीं मिला। यही कारण है कि मैं इस तरह से चुनता हूं। – Sas

+1

आईएमएचओ यह कोई समस्या नहीं है। आप मिनटों से हमेशा घंटे/मिनट प्राप्त कर सकते हैं। 230 मिनट = 2 घंटे 50 मिनट। मैं वास्तव में यह मेरे जवाब में प्रदर्शित करता हूं। –

2
DECLARE @Tab TABLE 
(
    data CHAR(5) 
) 

INSERT @Tab 
SELECT '25:30' UNION ALL 
SELECT '31:45' UNION ALL 
SELECT '16:00' 

SELECT STUFF(CONVERT(CHAR(8), DATEADD(SECOND, theHours + theMinutes, 
    '19000101'), 8), 1, 2, CAST((theHours + theMinutes)/3600 AS VARCHAR(12))) 
FROM (
    SELECT ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 3600 * 
     LEFT(data, CHARINDEX(':', data) - 1) END)) AS theHours, 
    ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 60 * 
     SUBSTRING(data, CHARINDEX(':', data) + 1, 2) END)) AS theMinutes 
    FROM @Tab 
) AS d 
3

आदेश एक कर्मचारी के लिए काम के घंटे योग करने के लिए आपको पारी के बीच अंतर की गणना कर सकते मिनट में समय और समाप्ति समय शुरू करने और पठनीय प्रारूप करने के लिए यह निम्नलिखित के रूप में परिवर्तित:

DECLARE @StartTime  datetime = '08:00' 
    DECLARE @EndTime  datetime = '10:47' 
    DECLARE @durMinutes  int 
    DECLARE @duration  nvarchar(5) 

    SET @durMinutes = DATEDIFF(MINUTE, @StartTime, @EndTime) 

    SET @duration = 
    (SELECT RIGHT('00' + CAST((@durMinutes/60) AS VARCHAR(2)),2) + ':' + 
      RIGHT('00' + CAST((@durMinutes % 60) AS VARCHAR(2)), 2)) 

    SELECT @duration 

परिणाम: 02:47 दो घंटे और 47 मिनट