2012-11-27 16 views
24

मुझे दो तिथियों के बीच समय अंतर की गणना करने में कुछ कठिनाई का सामना करना पड़ रहा है।दो तिथियों के बीच एसक्यूएल समय अंतर एचएच: मिमी: एसएस

मैं क्या चाहता हूँ, मैं दो तिथियों का कहना है

@StartDate = '10/01/2012 08:40:18.000' 
@EndDate='10/04/2012 09:52:48.000' 

तो hh:mm:ss के रूप में दो दिनांकों के बीच अंतर 72:42:30 है जाने की है।

मैं इस परिणाम को टी-एसक्यूएल क्वेरी में कैसे प्राप्त कर सकता हूं?

+0

[टी एसक्यूएल के साथ गिना जा रहा है समयावधि] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/758891/calculating-timespan- तब दिखाई देते हैं साथ-टी-एसक्यूएल) – Pfitz

उत्तर

34
declare @StartDate datetime, @EndDate datetime 

select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' 

select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) as [hh:mm:ss] 

यह क्वेरी आपके लिए सहायक होगी।

+2

मुझे लगता है कि अंतर केवल 'एचएच: मिमी: एसएस] 'है। तो डुप्लिकेट जवाब जोड़ें मत। – hims056

9

जबकि शायद सबसे कारगर नहीं, तो इस काम करेगा:

declare @StartDate datetime, @EndDate datetime 

select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' 

select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) 

आप दो चयन चला सकते हैं तो यह बेहतर होगा क्योंकि आप केवल एक बार DateDiff कार्य करें:

declare @StartDate datetime, @EndDate datetime 

select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' 
declare @Sec BIGINT 

select @Sec = DateDiff(s, @startDate, @EndDate) 

select convert(varchar(5),@sec/3600)+':'+convert(varchar(5),@sec%3600/60)+':'+convert(varchar(5),(@sec%60)) 
+0

धन्यवाद बहुत ग्रेग। यह कमाल काम कर रहा है। बहुत सराहना की। –

0

इन पर एक नज़र डालें। मैंने इसे पढ़ने योग्य रखने के लिए अधिक कोष्ठक का उपयोग नहीं किया है, इसलिए याद रखें कि गुणा अतिरिक्त या घटाव से पहले किया जाता है।

दोनों वापसी नीचे:

hr mins sec timediff 
73 12 30 73:12:30 

यह एक उप क्वेरी का उपयोग और सबसे पठनीय और समझ में आने नहीं करने के लिए लिखा है:

declare @StartDate datetime, 
@EndDate datetime 

set @StartDate = '10/01/2012 08:40:18.000' 
set @EndDate = '10/04/2012 09:52:48.000' 

select datediff(hour, @StartDate, @EndDate) hr, 
    datediff(minute, @StartDate, @EndDate) 
    - datediff(hour, @StartDate, @EndDate) * 60 mins, 
    datediff(second, @StartDate, @EndDate) 
    - (datediff(minute, @StartDate, @EndDate) * 60) sec, 
    cast(datediff(hour, @StartDate, @EndDate) as varchar)+':'+ 
    cast(datediff(minute, @StartDate, @EndDate) 
    - datediff(hour, @StartDate, @EndDate) * 60 as varchar)+':'+ 
    cast(datediff(second, @StartDate, @EndDate) 
    - (datediff(minute, @StartDate, @EndDate) * 60) as varchar) timediff 

यह एक संस्करण है कि अगर आप बेहतर प्रदर्शन होता है बहुत सारे डेटा हैं इसके लिए एक उप-क्वेरी की आवश्यकता है।

declare @StartDate datetime, 
@EndDate datetime 

set @StartDate = '10/01/2012 08:40:18.000' 
set @EndDate = '10/04/2012 09:52:48.000' 

select s.seconds/3600 hrs, 
s.seconds/60 - (seconds/3600) * 60 mins, 
s.seconds - (s.seconds/60) * 60 seconds, 
cast(s.seconds/3600 as varchar) + ':' + 
cast((s.seconds/60 - (seconds/3600) * 60) as varchar) + ':' + 
cast((s.seconds - (s.seconds/60) * 60) as varchar) timediff 
from (select datediff(second, @StartDate, @EndDate) as seconds) s 
0

मैं इस पोस्ट में आज आया क्योंकि मैं अलग-अलग तालिकाओं में स्थित फ़ील्ड के बीच समय अंतर को इकट्ठा करने की कोशिश कर रहा था। यह इस तरह के प्रयास के लिए कामकाजी कोड है। (एसक्यूएल 2010 में परीक्षण किया गया) ध्यान रखें कि मेरी मूल क्वेरी एक सामान्य कीफील्ड पर 6 टेबलों में सह-जुड़ गई है, नीचे दिए गए कोड में मैंने अन्य तालिकाओं को हटा दिया है ताकि पाठक के लिए कोई भ्रम न हो।

क्वेरी का उद्देश्य CreateUTC & बैकअपअप के बीच अंतर की गणना करना है, जहां दिन में अंतर व्यक्त किया जाता है और फ़ील्ड को 'DaysActive' कहा जाता है।

declare @CreatedUTC datetime 
declare @BackupUtc datetime 


SELECT TOP 500 

table02.Column_CreatedUTC AS DeviceCreated, 
CAST(DATEDIFF(day, table02.Column_CreatedUTC, table03.Column_EndDateUTC) AS nvarchar(5))+ ' Days' As DaysActive, 
table03.Column_EndDateUTC AS LastCompleteBackup 

FROM 

Operations.table01 AS table01 

LEFT OUTER JOIN 

    dbo.table02 AS table02 
ON 
    table02.Column_KeyField = table01.Column_KeyField 

LEFT OUTER JOIN 

    dbo.table03 AS table03 
ON 
    table01.Column_KeyField = table03.Column_KeyField 

Where table03.Column_EndDateUTC > dateadd(hour, -24, getutcdate()) --Gathers records with an end date in the last 24 hours 
AND table02.[Column_CreatedUTC] = COALESCE(@CreatedUTC, table02.[Column_CreatedUTC]) 
AND table03.[Column_EndDateUTC] = COALESCE(@BackupUTC, table03.[Column_EndDateUTC]) 

GROUP BY table03.Column_EndDateUTC, table02.Column_CreatedUTC 
ORDER BY table02.Column_CreatedUTC ASC, DaysActive, table03.Column_EndDateUTC DESC 

इस प्रकार उत्पादन होगा:

[DeviceCreated]..[DaysActive]..[LastCompleteBackup] 
--------------------------------------------------------- 
[2/13/12 16:04]..[463 Days]....[5/21/13 12:14] 
[2/12/13 22:37]..[97 Days].....[5/20/13 22:10] 
-1

घोषित @StartDate datetime, @EndDate datetime

set @StartDate = '10/01/2012 08:40:18.000' 
set @EndDate = '10/04/2012 09:52:48.000' 

SELECT CONVERT(CHAR(8), CAST(CONVERT(varchar(23),@EndDate,121) AS DATETIME) 
-CAST(CONVERT(varchar(23),@StartDate,121)AS DATETIME),8) AS TimeDiff 
+0

यह देता है: "01:12:30" परिणामस्वरूप। – Wodzu

0

यह स्क्रिप्ट लिखने की प्रतिलिपि फिर अपने स्क्रिप्ट फ़ाइल और परिवर्तन में लिखने आपके आवश्यक फ़ील्ड और

DECLARE @Sdate DATETIME, @Edate DATETIME, @Timediff VARCHAR(100) 
SELECT @Sdate = '02/12/2014 08:40:18.000',@Edate='02/13/2014 09:52:48.000' 
SET @Timediff=DATEDIFF(s, @Sdate, @Edate) 
SELECT CONVERT(VARCHAR(5),@Timediff/3600)+':'+convert(varchar(5),@Timediff%3600/60)+':'+convert(varchar(5),@Timediff%60) AS TimeDiff 
4

यदि आप निहित प्रकार के कास्टिंग का विरोध नहीं कर रहे हैं तो मैं इसे एक वैकल्पिक समाधान प्रदान करूंगा। क्या यह बेहतर स्वरूपण के साथ अधिक पठनीय है? आप ही फैन्सला करें।

DECLARE @StartDate datetime = '10/01/2012 08:40:18.000' 
     ,@EndDate datetime = '10/04/2012 09:52:48.000' 

SELECT 
    STR(ss/3600, 5) + ':' + RIGHT('0' + LTRIM(ss%3600/60), 2) + ':' + RIGHT('0' + LTRIM(ss%60), 2) AS [hh:mm:ss] 
FROM (VALUES(DATEDIFF(s, @StartDate, @EndDate))) seconds (ss) 
0
DECLARE @StartDate datetime = '10/01/2012 08:40:18.000' 
     ,@EndDate datetime = '10/10/2012 09:52:48.000' 
     ,@DaysDifferent int = 0 
     ,@Sec BIGINT 

select @Sec = DateDiff(s, @StartDate, @EndDate) 

IF (DATEDIFF(day, @StartDate, @EndDate) > 0) 
    BEGIN 
     select @DaysDifferent = DATEDIFF(day, @StartDate, @EndDate) 
     select @Sec = @Sec - (@DaysDifferent * 86400) 
     SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss] 
    END 
ELSE 
    BEGIN 
     SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss] 
    END 

---------------------------------------------------------------------------------- 
dd HH:MM:SS 
9d 1:12:30 
2
DECLARE @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12' 

SELECT CAST((@[email protected]) as time(0)) 
+0

एक ही चयन कथन के भीतर, मेरे पास एक कॉलम भविष्य में एक समय लौटा रहा है, दूसरा कॉलम getdate() है और तीसरा कॉलम क्रमशः भविष्य की तारीख और getdate() की परिभाषा के साथ dt2 और dt1 को बदलकर आपके तर्क का उपयोग करता है। , 20,590 \t 13:14:21 मेरी गणित करके वहाँ के बारे में 24 + 11 घंटे होना चाहिए: 00: 00.000 \t 2017/04/11 10: 14 वापसी मान 2017/04/12 21 हैं यानी, उनके बीच 35 घंटे, नहीं 13. – youcantryreachingme

19

कम से कम कोड होगा:

Select CAST((@[email protected]) as time(0)) '[hh:mm:ss]' 
+5

यह केवल तभी काम करता है जब अंतर 24 घंटे से कम हो .... – Waqas

+1

यह भी डेटाटाइम डेटाटाइप के साथ ही काम करता है, न कि टाइमटाइम 2 डेटाटाइप – reedstonefood

0
declare @StartDate datetime, @EndDate datetime 

select @StartDate = '2016-05-04 10:23:41.083',@EndDate='2016-05-04 10:25:26.053' 

select CAST(DateDiff(MI, @startDate, @EndDate)/60 AS varchar)+':'+Cast(DateDiff(MI, @startDate, @EndDate)%60 AS varchar)+':'+cast(DateDiff(s, @startDate, @EndDate)%60 AS varchar) as [hh:mm:ss] 

इस मदद मिलेगी भी

1

मैं तो यह एक समारोह में इस बनाने का विचार पसंद पुनः उपयोग करने योग्य हो जाता है और आपके प्रश्न पढ़ने के लिए बहुत आसान हो जाते हैं:

--get the difference between two datetimes in the format: 'h:m:s' 
CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME) 
RETURNS VARCHAR(10) 
AS BEGIN 
    DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate) 
    DECLARE @difference VARCHAR(10) = 
    CONVERT(VARCHAR(4), @seconds/3600) + ':' + 
    CONVERT(VARCHAR(2), @seconds % 3600/60) + ':' + 
    CONVERT(VARCHAR(2), @seconds % 60) 
    RETURN @difference 
END 

उपयोग:

DECLARE @StartDate DATETIME = '10/01/2012 08:40:18.000' 
DECLARE @endDate DATETIME = '10/04/2012 09:52:48.000' 

SELECT dbo.getDateDiff(@startDate, @endDate) AS DateDifference 

परिणाम:

DateDifference 
1 73:12:30 

यह भी अगर आप गद्दी जोड़ें ताकि प्रारूप हमेशा होता है hh:mm:ss परिणाम को पढ़ने के लिए आसान है। उदाहरण के लिए, यहाँ आप कैसे करना होगा कि एसक्यूएल सर्वर 2012 या बाद में:

--get the difference between two datetimes in the format: 'hh:mm:ss' 
CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME) 
RETURNS VARCHAR(10) 
AS BEGIN 
    DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate) 
    DECLARE @difference VARCHAR(10) = 
    FORMAT(@seconds/3600), '00') + ':' + 
    FORMAT(@seconds % 3600/60, '00') + ':' + 
    FORMAT(@seconds % 60, '00') 
    RETURN @difference 
END 

ध्यान दें कि यह घंटे क्लिप नहीं होगा अगर यह अधिक से अधिक 2 अंक लंबा है। तो 1 घंटे 01:00:00 के रूप में तब दिखाई देते हैं और 100 घंटे के रूप में 100:00:00

-1
declare @StartDate datetime; 
declare @EndDate datetime; 
select @StartDate = '10/01/2012 08:40:18.000'; 
select @EndDate='10/04/2012 09:52:48.000'; 
select cast(datediff(hour,@StartDate,@EndDate) as varchar(10)) + left(right(cast(cast(cast((@[email protected]) as datetime) as time) as varchar(16)),14),6) 
संबंधित मुद्दे