Sql सर्वर में दो दिनांक समय का अंतर


83

क्या datetimesql सर्वर में दो के बीच अंतर लेने का कोई तरीका है ?

उदाहरण के लिए, मेरी तारीखें हैं

  1. 2010-01-22 15:29:55.090
  2. 2010-01-22 15:30:09.153

तो, परिणाम होना चाहिए 14.063 seconds


2
आपको सभी datediffउत्तर मिल रहे हैं, लेकिन कोई भी आपको यह याद दिलाने के लिए नहीं लगता है कि पैरामीटर ऑर्डर के आधार पर आपको इससे नकारात्मक परिणाम मिल सकते हैं।
पासी सावोलनें जू

जवाबों:


94

DateDiff के बारे में जोड़ने के लिए केवल एक चेतावनी, यह आपके द्वारा अपनी इकाइयों के रूप में निर्दिष्ट सीमा को पारित करने की संख्या को गिना जाता है, इसलिए यदि आप एक सटीक समय के लिए देख रहे हैं तो यह समस्याओं के अधीन है। जैसे

select datediff (m, '20100131', '20100201')

1 का उत्तर देता है, क्योंकि इसने जनवरी से फरवरी तक सीमा पार कर ली थी, इसलिए भले ही अवधि 2 दिन हो, दिनांकित 1 का मान लौटाएगा - यह 1 तिथि सीमा पार कर गया।

select datediff(mi, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')

1 का मान देता है, फिर से, यह मिनट सीमा को एक बार पारित कर देता है, इसलिए भले ही यह लगभग 14 सेकंड है, इकाइयों के रूप में मिनट का उपयोग करते समय इसे एक मिनट के रूप में वापस किया जाएगा।


29
SELECT DATEDIFF (MyUnits, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

MSDN पर DatedIFF पर आधारित "MyUnits" को सब्स्टीट्यूट करें


18
SELECT  DATEDIFF(day, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

dayआप जिन अन्य इकाइयों से अंतर प्राप्त करना चाहते हैं उन्हें प्रतिस्थापित करें, जैसे second, minuteआदि।


16

मैं एमएस SQL ​​सर्वर के चार महत्वपूर्ण कार्यों का उल्लेख कर सकता हूं जो बहुत उपयोगी हो सकते हैं:

1) समारोह DateDiff () दो तिथियों के बीच calculate मतभेद के लिए जिम्मेदार है, परिणाम हो सकता है " साल तिमाही महीने dayofyear दिन के सप्ताह घंटे मिनट दूसरा मिलीसेकंड माइक्रोसेकंड nanosecond ", पहले पैरामीटर (पर निर्दिष्ट DatePart ):

select datediff(day,'1997-10-07','2011-09-11')

2) आप वास्तविक समय पाने और कुछ तारीख और वास्तविक तारीख के अंतर की गणना करने के लिए फ़ंक्शन GETDATE () का उपयोग कर सकते हैं :

select datediff(day,'1997-10-07', getdate() )

3) एक और महत्वपूर्ण कार्य DATEADD () है , जिसका उपयोग डेटटाइम के समान दिनांक का उपयोग करके डेटटाइम में कुछ मान परिवर्तित करने के लिए किया जाता है , जिसे आप एक सकारात्मक आधार के साथ (सकारात्मक मूल्यों के साथ) जोड़ सकते हैं या घटा सकते हैं (नकारात्मक मानों के साथ):

select DATEADD(day,  45, getdate()) -- actual datetime adding 45 days
select DATEADD(  s,-638, getdate()) -- actual datetime subtracting 10 minutes and 38 seconds

4) फ़ंक्शन CONVERT () आपकी ज़रूरत की तरह दिनांक को प्रारूपित करने के लिए बनाया गया था, यह पैरामीट्रिक फ़ंक्शन नहीं है, लेकिन आप परिणाम के भाग का उपयोग उस परिणाम के लिए कर सकते हैं जैसे आपको ज़रूरत है:

select convert(  char(8), getdate() ,   8) -- part hh:mm:ss of actual datetime
select convert(  varchar, getdate() , 112) -- yyyymmdd
select convert( char(10), getdate() ,  20) -- yyyy-mm-dd limited by 10 characters

DATETIME ठंड की गणना सेकंड में की जाती है और इन चार फ़ंक्शन को मिलाकर एक दिलचस्प परिणाम दो रूपों के बीच एक निर्धारित अंतर um घंटे, मिनट और सेकंड ( hh: mm: ss ) दिखाना है:

declare  @date1 datetime, @date2 datetime
set @date1=DATEADD(s,-638,getdate())
set @date2=GETDATE()

select convert(char(8),dateadd(s,datediff(s,@date1,@date2),'1900-1-1'),8)

... परिणाम 00:10:38 (638s = 600s + 38s = 10 मिनट और 38 सेकंड)

एक और उदाहरण:

select distinct convert(char(8),dateadd(s,datediff(s, CRDATE , GETDATE() ),'1900-1-1'),8) from sysobjects order by 1

9

मैंने इस तरह से कोशिश की और यह काम कर गया। मैंने SQL सर्वर संस्करण 2016 का उपयोग किया है

SELECT DATEDIFF(MILLISECOND,'2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')/1000.00;

विभिन्न दिनांकित कार्य हैं:

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

Ref: https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017


7

ठीक है, हम सभी जानते हैं कि उत्तर में शामिल है DATEDIFF()। लेकिन यह आपको केवल आधा परिणाम देता है जो आपके बाद हो सकता है। यदि आप दो DATETIMEमानों के बीच मिनट और सेकंड के संदर्भ में मानव-पठनीय प्रारूप में परिणाम प्राप्त करना चाहते हैं, तो क्या होगा ?

CONVERT(), DATEADD()और निश्चित रूप से DATEDIFF()काम करता है एक और अधिक आसानी से पढ़ने योग्य नतीजा यह है कि अपने ग्राहकों, उपयोग कर सकते हैं एक नंबर के बजाय के लिए एकदम सही हैं।

अर्थात

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

यह आपको कुछ इस तरह देगा:

HH: MM

यदि आप अधिक सटीक चाहते हैं, तो बस बढ़ाएँ VARCHAR()

CONVERT(varchar(12), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

HH: MM.SS.MS


5

आंतरिक रूप से SQL सर्वर तिथियों में 2 पूर्णांक के रूप में संग्रहीत किया जाता है। पहला पूर्णांक आधार तिथि (1900/01/01) से पहले या बाद की तारीखों की संख्या है। दूसरा पूर्णांक मध्यरात्रि के बाद घड़ी की टिक की संख्या को संग्रहीत करता है, प्रत्येक टिक एक सेकंड का 1/300 है।

अधिक जानकारी यहाँ

इस वजह से, मुझे अक्सर तारीखों की तुलना करने का सबसे सरल तरीका लगता है कि बस उन्हें प्रतिस्थापित करना है। यह मेरे उपयोग के 90% मामलों को संभालता है। उदाहरण के लिए,

select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...

जब मुझे दिनों के अलावा इकाइयों में उत्तर की आवश्यकता होती है, तो मैं डेटडिफ़ का उपयोग करूंगा ।


6
ध्यान दें कि यह केवल पुराने पर लागू होता है DATETIMEप्रकार, के लिए नहीं DATE, TIMEया DATETIME2। इसके अलावा, लौटाया गया मूल्य एक और होगा DATETIME, इसलिए आपको तिथियों के बीच मानव-पठनीय संख्या प्राप्त करने के लिए इसे डालना होगा।

5

दिनांक अंतर / समय की तुलना करने पर दिनांक अंतर को देखने के कई तरीके हैं, और अधिक। यहाँ "HH: MM: SS" के रूप में प्रारूपित दो तिथियों के बीच अंतर प्राप्त करने के लिए मैं क्या उपयोग कर रहा हूँ:

ElapsedTime AS
      RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)

मैंने इसका उपयोग एक गणना किए गए कॉलम के लिए किया था, लेकिन आप इसे यूडीएफ या क्वेरी गणना के रूप में फिर से लिख सकते हैं। ध्यान दें कि यह तर्क भिन्नात्मक सेकंड को गोल करता है; 00: 00.00 से 00: 00.999 को शून्य सेकंड माना जाता है, और इसे "00:00:00" के रूप में प्रदर्शित किया जाता है।

यदि आप अनुमान लगाते हैं कि अवधि कुछ दिनों से अधिक लंबी हो सकती है, तो यह कोड डी: एचएच: एमएम: एसएस प्रारूप में बदल जाता है जब जरूरत होती है:

ElapsedTime AS
    CASE WHEN DATEDIFF(S, StartDate, EndDate) >= 359999
        THEN
                          CAST(DATEDIFF(S, StartDate, EndDate) / 86400        AS VARCHAR(7)) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 86400 / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %  3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %    60        AS VARCHAR(2)), 2)
        ELSE
              RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)
        END

5

निम्नलिखित क्वेरी को वह सटीक सामग्री देनी चाहिए जिसकी आप तलाश कर रहे हैं।

select datediff(second, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')

यहां MSDN से लिंक दिया गया है कि आप datediff फ़ंक्शन के साथ क्या कर सकते हैं। https://msdn.microsoft.com/en-us/library/ms189794.aspx


3
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff

यह आपको वर्ष में दो तिथियों के बीच अंतर देता है

यहां (2017-2011) = परिणामस्वरूप 6

वाक्य - विन्यास:

DATEDIFF(interval, date1, date2)

2

इसके लिए इसका उपयोग करें DD:MM:SS:

SELECT CONVERT(VARCHAR(max), Datediff(dd, '2019-08-14 03:16:51.360', 
         '2019-08-15 05:45:37.610')) 
       + ':' 
       + CONVERT(CHAR(8), Dateadd(s, Datediff(s, '2019-08-14 03:16:51.360', 
         '2019-08-15 05:45:37.610'), '1900-1-1'), 8) 

1

तो यह मेरा जवाब नहीं है, लेकिन मैं इस तरह के रूप में अच्छी तरह से एक सवाल के लिए ऑनलाइन खोज के दौरान यह पाया। इस आदमी ने घंटे, मिनट और सेकंड की गणना करने के लिए एक प्रक्रिया निर्धारित की। लिंक और कोड:

--Creating Function
If OBJECT_ID('UFN_HourMinuteSecond') Is Not Null
Drop Function dbo.UFN_HourMinuteSecond
Go
Exec(
'Create Function dbo.UFN_HourMinuteSecond
(
@StartDateTime DateTime,
@EndDateTime DateTime
) Returns Varchar(10) 
As
Begin

Declare @Seconds Int,
@Minute Int,
@Hour Int,
@Elapsed Varchar(10)

Select @Seconds = ABS(DateDiff(SECOND ,@StartDateTime,@EndDateTime))

If @Seconds >= 60 
Begin
select @Minute = @Seconds/60
select @Seconds = @Seconds%60

If @Minute >= 60
begin
select @hour = @Minute/60
select @Minute = @Minute%60
end

Else
Goto Final 
End

Final:
Select @Hour = Isnull(@Hour,0), @Minute = IsNull(@Minute,0), @Seconds =               IsNull(@Seconds,0)
select @Elapsed = Cast(@Hour as Varchar) + '':'' + Cast(@Minute as Varchar) + '':'' +     Cast(@Seconds as Varchar)

Return (@Elapsed)
End'
)

1
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'

select CAST((@dt2-@dt1) as time(0))


1
select
datediff(millisecond,'2010-01-22 15:29:55.090','2010-01-22 15:30:09.153') / 1000.0 as Secs

result:
Secs
14.063

बस सोचा था कि मैं इसका उल्लेख करूंगा।


1

क्रिएट फंक्शन getDateDiffHours (@fdate AS डेटाइम, @ tdate as datetime) RETURNS varchar (50) AS BEGIN DECLARE @cnt int DECLARE @cntDeData डेटलाइक DECLARE @dayDiff int DECLare @dayDiffWk int DECLare @hrsDiffe

DECLARE @markerFDate datetime
DECLARE @markerTDate datetime

DECLARE @fTime int
DECLARE @tTime int 


DECLARE @nfTime varchar(8)
DECLARE @ntTime varchar(8)

DECLARE @nfdate datetime
DECLARE @ntdate datetime

-------------------------------------
--DECLARE @fdate datetime
--DECLARE @tdate datetime

--SET @fdate = '2005-04-18 00:00:00.000'
--SET @tdate = '2005-08-26 15:06:07.030'
-------------------------------------

DECLARE @tempdate datetime

--setting weekends
SET @fdate = dbo.getVDate(@fdate)
SET @tdate = dbo.getVDate(@tdate)
--RETURN @fdate 

SET @fTime = datepart(hh,@fdate)
SET @tTime = datepart(hh,@tdate)
--RETURN @fTime 
if datediff(hour,@fdate, @tdate) <= 9

        RETURN(convert(varchar(50),0) + ' Days ' + convert(varchar(50),datediff(hour,@fdate, @tdate)))  + ' Hours'
else
--setting working hours
SET @nfTime = dbo.getV00(convert(varchar(2),datepart(hh,@fdate))) + ':' +dbo.getV00(convert(varchar(2),datepart(mi,@fdate))) + ':'+  dbo.getV00(convert(varchar(2),datepart(ss,@fdate)))
SET @ntTime = dbo.getV00(convert(varchar(2),datepart(hh,@tdate))) + ':' +dbo.getV00(convert(varchar(2),datepart(mi,@tdate))) + ':'+  dbo.getV00(convert(varchar(2),datepart(ss,@tdate)))

IF @fTime > 17 
begin
    set @nfTime = '17:00:00'
end 
else
begin
    IF @fTime < 8 
        set @nfTime = '08:00:00'
end 

IF @tTime > 17 
begin
    set @ntTime = '17:00:00'
end 
else
begin
    IF @tTime < 8 
        set @ntTime = '08:00:00'
end 



-- used for working out whole days

SET @nfdate = dateadd(day,1,@fdate) 

SET @ntdate = @tdate
SET @nfdate = convert(varchar,datepart(yyyy,@nfdate)) + '-' + convert(varchar,datepart(mm,@nfdate)) + '-' + convert(varchar,datepart(dd,@nfdate))
SET @ntdate = convert(varchar,datepart(yyyy,@ntdate)) + '-' + convert(varchar,datepart(mm,@ntdate)) + '-' + convert(varchar,datepart(dd,@ntdate))
SET @cnt = 0
SET @dayDiff = 0 
SET @cntDate = @nfdate
SET @dayDiffWk = convert(decimal(18,2),@ntdate-@nfdate)

--select @nfdate,@ntdate

WHILE @cnt < @dayDiffWk
BEGIN   
    IF (NOT DATENAME(dw, @cntDate) = 'Saturday') AND (NOT DATENAME(dw, @cntDate) = 'Sunday')
    BEGIN 
        SET @dayDiff = @dayDiff + 1
    END 
    SET @cntDate = dateadd(day,1,@cntDate)
    SET @cnt = @cnt + 1
END 

--SET @dayDiff = convert(decimal(18,2),@ntdate-@nfdate) --datediff(day,@nfdate,@ntdate)
--SELECT @dayDiff

set @fdate = convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) + ' ' + @nfTime
set @tdate = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate)) + ' ' + @ntTime

set @markerFDate = convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) + ' ' + '17:00:00'
set @markerTDate = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate)) + ' ' + '08:00:00'

--select @fdate,@tdate
--select @markerFDate,@markerTDate

set @hrsDiff = convert(decimal(18,2),datediff(hh,@fdate,@markerFDate))

--select @hrsDiff
set @hrsDiff = @hrsDiff +  convert(int,datediff(hh,@markerTDate,@tdate))

--select @fdate,@tdate  

IF convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate))  
BEGIN
    --SET @hrsDiff = @hrsDiff - 9
    Set @hrsdiff = datediff(hour,@fdate,@tdate)
END 

--select FLOOR((@hrsDiff / 9))

IF (@hrsDiff / 9) > 0 
BEGIN
    SET @dayDiff = @dayDiff + FLOOR(@hrsDiff / 9)
    SET @hrsDiff = @hrsDiff - FLOOR(@hrsDiff / 9)*9
END 

--select convert(varchar(50),@dayDiff) + ' Days ' + convert(varchar(50),@hrsDiff)   + ' Hours'

RETURN(convert(varchar(50),@dayDiff) + ' Days ' + convert(varchar(50),@hrsDiff))    + ' Hours'

समाप्त


1
क्या आप प्रश्न के अनुसार अपने कोड की व्याख्या कर सकते हैं?
user7294900

1

सोल-1:

select 
  StartTime
  , EndTime
  , CONVERT(NVARCHAR,(EndTime-StartTime), 108) as TimeDiff 
from 
  [YourTable]

सोल-2:

select 
  StartTime
  , EndTime
  , DATEDIFF(hh, StartTime, EndTime)
  , DATEDIFF(mi, StartTime, EndTime) % 60 
from 
  [YourTable]

सोल-3:

select 
  DATEPART(hour,[EndTime]-[StartTime])
  , DATEPART(minute,[EndTime]-[StartTime]) 
from 
  [YourTable]

डेटपार्ट सबसे अच्छा काम करता है


1

कृपया दो तिथियों के बीच तिथि अंतर जानने के लिए नीचे दिए गए ट्रिक को देखें

 DATEDIFF(DAY,ordr.DocDate,RDR1.U_ProgDate) datedifff

जहाँ आप अपनी आवश्यकता के अनुसार बदल सकते हैं जैसे आप दिन या महीने या साल या समय का अंतर चाहते हैं।


0

मेरे लिए यह पूरी तरह से रूपांतरित (varchar (8), DATEADD (SECOND, DatedIFF (SECOND, LogInTime, LogOutTime)), 0), 114) में काम करता है।

और आउटपुट HH: MM: SS है जो मेरे मामले में सटीक रूप से दिखाया गया है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.