2012-12-13 15 views
10

मेरे पास एक SQL सर्वर तालिका है जिसमें "टाइम" कॉलम है। तालिका एक संदेश तालिका है जो प्रत्येक संदेश के लिए घर की स्थिति संदेश और टाइमस्टैम्प है। लॉग तालिका को बैच फ़ाइल के माध्यम से डाला जाता है। एक आईडी कॉलम है जो समूह पंक्तियों को एकसाथ करता है। प्रत्येक बार जब बैच फ़ाइल चलता है तो यह आईडी को प्रारंभ करता है और रिकॉर्ड लिखता है। मुझे क्या करना है आईडी आईडी में पहले रिकॉर्ड से एक ही आईडी सेट के अंतिम रिकॉर्ड में विलुप्त समय प्राप्त करना है। मैंने लॉगटेबल से चुनिंदा मैक्स (टाइम) - न्यूनतम (समय) के साथ टॉयइंग करना शुरू किया जहां आईडी = लेकिन यह सही ढंग से प्रारूपित करने का तरीका नहीं समझ सका। मुझे एचएच में इसकी जरूरत है: एमएम: एसएस।एसक्यूएल सर्वर - एचएच में दो डेटाटाइम टिकटों के बीच विलुप्त समय की गणना करें: एमएम: एसएस प्रारूप

+0

के बीच अंतर की गणना करने के लिए हमें "टाइम" स्तंभ के डेटाप्रकार से अवगत कराएं। डेटटाइम, डेटटाइम 2, टाइम, टाइमस्टैम्प, आदि –

+0

@ टिम ... मेरा बुरा, डेटटाइम – MikeTWebb

उत्तर

8

SQL सर्वर SQL मानक अंतराल डेटा प्रकार का समर्थन नहीं करता है। आपकी सबसे अच्छी शर्त सेकेंड में अंतर की गणना करना है, और परिणाम स्वरूपित करने के लिए फ़ंक्शन का उपयोग करना है। मूल कार्य CONVERT() ठीक काम करने के लिए प्रतीत होता है जब तक आपका अंतराल 24 घंटे से कम हो। लेकिन CONVERT() इसके लिए एक अच्छा समाधान नहीं है।

create table test (
    id integer not null, 
    ts datetime not null 
); 

insert into test values (1, '2012-01-01 08:00'); 
insert into test values (1, '2012-01-01 09:00'); 
insert into test values (1, '2012-01-01 08:30'); 
insert into test values (2, '2012-01-01 08:30'); 
insert into test values (2, '2012-01-01 10:30'); 
insert into test values (2, '2012-01-01 09:00'); 
insert into test values (3, '2012-01-01 09:00'); 
insert into test values (3, '2012-01-02 12:00'); 

मान इस तरह से कि के लिए

  • आईडी = 1, बीता हुआ समय 1 घंटे
  • आईडी = 2, बीता हुआ समय 2 घंटे है में चुने गए हैं, और
  • आईडी = 3, विलुप्त समय 3 घंटे है।

यह चयन विवरण में एक कॉलम शामिल है जो सेकेंड की गणना करता है, और एक जो कन्वर्ट() को घटाव के साथ उपयोग करता है।

select t.id, 
     min(ts) start_time, 
     max(ts) end_time, 
     datediff(second, min(ts),max(ts)) elapsed_sec, 
     convert(varchar, max(ts) - min(ts), 108) do_not_use 
from test t 
group by t.id; 

ID START_TIME     END_TIME     ELAPSED_SEC DO_NOT_USE 
1 January, 01 2012 08:00:00 January, 01 2012 09:00:00 3600   01:00:00 
2 January, 01 2012 08:30:00 January, 01 2012 10:30:00 7200   02:00:00 
3 January, 01 2012 09:00:00 January, 02 2012 12:00:00 97200  03:00:00 

नोट भ्रामक "03:00:00" 27 घंटे का अंतर के लिए आईडी नंबर 3.

Function to format elapsed time in SQL Server

+0

@Catcall .... प्रश्न: आपकी क्वेरी इन दो तिथियों के लिए काम करती है जो दो दिनों में फैली हुई है (2012-12-13 15: 10: 12.050 और 2012-12-12 20: 16: 47.160)। आपके परिणाम 68005 सेकंड और 18:53:24 थे। यह सही प्रतीत होता है। यकीन नहीं है क्यों do_not_use 18:53:24 क्यों है? – MikeTWebb

+1

CONVERT() 24 घंटे से अधिक अंतराल के लिए गलत जवाब देता है। आपके दो टाइमस्टैम्प के बीच का अंतर 24 घंटे से कम है। "Do_not_use" कॉलम अंतराल प्रारूपित करने के लिए CONVERT() का उपयोग करने से आपको हतोत्साहित करने के लिए है। –

+0

@Catcall ... हाँ, मैं "do_not_use" कॉलम का अर्थ समझ गया। मैं CONVERT() के बारे में उत्सुक था .... और आपकी व्याख्या सही है। धन्यवाद! – MikeTWebb

0

select convert(varchar, Max(Time) - Min(Time) , 108) from logTable where id=...

+0

दो टाइमस्टैम्प के बीच 27 घंटे के अंतर के लिए "03:00:00" आउटपुट होगा ... – XpiritO

8

UPDATED:

सही ढंग से एसक्यूएल सर्वर में एक समयावधि की गणना, भले ही 24 घंटों से अधिक:

-- Setup test data 
declare @minDate datetime = '2012-12-12 20:16:47.160' 
declare @maxDate datetime = '2012-12-13 15:10:12.050' 

-- Get timespan in hh:mi:ss 
select cast(
     (cast(cast(@maxDate as float) - cast(@minDate as float) as int) * 24) /* hours over 24 */ 
     + datepart(hh, @maxDate - @minDate) /* hours */ 
     as varchar(10)) 
    + ':' + right('0' + cast(datepart(mi, @maxDate - @minDate) as varchar(2)), 2) /* minutes */ 
    + ':' + right('0' + cast(datepart(ss, @maxDate - @minDate) as varchar(2)), 2) /* seconds */ 

-- Returns 18:53:24 

एज मामलों है कि अशुद्धि दिखाने के लिए विशेष रूप से स्वागत कर रहे हैं!

+0

@Tim .... यह लगभग काम करता है। इन दो तिथियों के लिए (2012-12-13 15: 10: 12.050 और 2012-12-12 20: 16: 47.160) आपकी क्वेरी ने 1 9:54:25 का परिणाम दिया जब वास्तविक मूल्य 18:53:24 है। विचार? – MikeTWebb

+0

@MikeTWebb आपको वर्तमान संस्करण को अच्छी तरह से काम करने के लिए मिल सकता है यदि आप किसी फ़ंक्शन का उपयोग नहीं करना चाहते हैं या कितने घंटे प्रदर्शित किए जा सकते हैं। –

1

पर देखने के लिए कि इस मदद करता है। मैं विलुप्त दिन, घंटे, मिनट, सेकेंड के लिए चर सेट कर सकता हूं। आप इसे अपनी पसंद के अनुसार प्रारूपित कर सकते हैं या उपयोगकर्ता परिभाषित फ़ंक्शन में शामिल कर सकते हैं।

नोट: डेटडिफ़ (एचएच, @ डेट 1, @ डेट 2) का उपयोग न करें। यह भरोसेमंद नहीं है! यह अप्रत्याशित तरीकों से घूमता है

दो तिथियां दी गईं ... (नमूना तिथियाँ: दो दिन, तीन घंटे, 10 मिनट, 30 सेकंड का अंतर)

declare @Date1 datetime = '2013-03-08 08:00:00' 
declare @Date2 datetime = '2013-03-10 11:10:30' 
declare @Days decimal 
declare @Hours decimal 
declare @Minutes decimal 
declare @Seconds decimal 

select @Days = DATEDIFF(ss,@Date1,@Date2)/60/60/24 --Days 
declare @RemainderDate as datetime = @Date2 - @Days 
select @Hours = datediff(ss, @Date1, @RemainderDate)/60/60 --Hours 
set @RemainderDate = @RemainderDate - (@Hours/24.0) 
select @Minutes = datediff(ss, @Date1, @RemainderDate)/60 --Minutes 
set @RemainderDate = @RemainderDate - (@Minutes/24.0/60) 
select @Seconds = DATEDIFF(SS, @Date1, @RemainderDate)  
select @Days as ElapsedDays, @Hours as ElapsedHours, @Minutes as ElapsedMinutes, @Seconds as ElapsedSeconds 
0

आशा इस दो समय टिकटों

Create PROC TimeDurationbetween2times(@iTime as time,@oTime as time) 
As 
Begin 

DECLARE @Dh int, @Dm int, @Ds int ,@Im int, @Om int, @Is int,@Os int  

SET @Im=DATEPART(MI,@iTime) 
SET @Om=DATEPART(MI,@oTime) 
SET @Is=DATEPART(SS,@iTime) 
SET @Os=DATEPART(SS,@oTime) 

SET @Dh=DATEDIFF(hh,@iTime,@oTime) 
SET @Dm = DATEDIFF(mi,@iTime,@oTime) 
SET @Ds = DATEDIFF(ss,@iTime,@oTime) 

DECLARE @HH as int, @MI as int, @SS as int 

if(@Im>@Om) 
begin 
SET @[email protected] 
end 
if(@Is>@Os) 
begin 
SET @[email protected] 
end 

SET @HH = @Dh 
SET @MI = @Dm-(60*@HH) 
SET @SS = @Ds-(60*@Dm) 

DECLARE @hrsWkd as varchar(8)   

SET @hrsWkd = cast(@HH as char(2))+':'+cast(@MI as char(2))+':'+cast(@SS as char(2))   

select @hrsWkd as TimeDuration 

End 
2
DECLARE @EndTime AS DATETIME, @StartTime AS DATETIME 

SELECT @StartTime = '2013-03-08 08:00:00', @EndTime = '2013-03-08 08:30:00' 

SELECT CAST(@EndTime - @StartTime AS TIME) 

परिणाम के बीच सही समय प्राप्त करने में मदद करता है: 00:30:00.0000000

प्रारूप परिणाम जैसा आप फिट देखते हैं।

+0

यह केवल SQL Server 2008+ में काम करता है, लेकिन यह एक अच्छा समाधान है मान लीजिए कि आप संस्करण की गारंटी दे सकते हैं। –

+0

विफल होगा यदि समय 24 घंटे से अधिक हो – Dave

1

सबसे अच्छा और आसान तरीका:

Convert(varchar, {EndTime} - {StartTime}, 108) 

बस Anri तरह का उल्लेख किया।

1

, मिलीसेकंड, सेकंड, मिनट, घंटे में मान देने के लिए DateDiff का प्रयोग करें ...

DateDiff (अंतराल, DATE1, DATE2)

अंतराल आवश्यक - समय/तारीख हिस्सा लौटने के लिये। निम्न मानों में से एक हो सकता है:

year, yyyy, yy = Year 
quarter, qq, q = Quarter 
month, mm, m = month 
dayofyear = Day of the year 
day, dy, y = Day 
week, ww, wk = Week 
weekday, dw, w = Weekday 
hour, hh = hour 
minute, mi, n = Minute 
second, ss, s = Second 
millisecond, ms = Millisecond 

DATE1, DATE2आवश्यक - दो तिथियों

संबंधित मुद्दे

 संबंधित मुद्दे