क्या datetime
sql सर्वर में दो के बीच अंतर लेने का कोई तरीका है ?
उदाहरण के लिए, मेरी तारीखें हैं
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
तो, परिणाम होना चाहिए 14.063 seconds
।
क्या datetime
sql सर्वर में दो के बीच अंतर लेने का कोई तरीका है ?
उदाहरण के लिए, मेरी तारीखें हैं
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
तो, परिणाम होना चाहिए 14.063 seconds
।
जवाबों:
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 सेकंड है, इकाइयों के रूप में मिनट का उपयोग करते समय इसे एक मिनट के रूप में वापस किया जाएगा।
मैं एमएस 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
मैंने इस तरह से कोशिश की और यह काम कर गया। मैंने 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
ठीक है, हम सभी जानते हैं कि उत्तर में शामिल है 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
आंतरिक रूप से SQL सर्वर तिथियों में 2 पूर्णांक के रूप में संग्रहीत किया जाता है। पहला पूर्णांक आधार तिथि (1900/01/01) से पहले या बाद की तारीखों की संख्या है। दूसरा पूर्णांक मध्यरात्रि के बाद घड़ी की टिक की संख्या को संग्रहीत करता है, प्रत्येक टिक एक सेकंड का 1/300 है।
इस वजह से, मुझे अक्सर तारीखों की तुलना करने का सबसे सरल तरीका लगता है कि बस उन्हें प्रतिस्थापित करना है। यह मेरे उपयोग के 90% मामलों को संभालता है। उदाहरण के लिए,
select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...
जब मुझे दिनों के अलावा इकाइयों में उत्तर की आवश्यकता होती है, तो मैं डेटडिफ़ का उपयोग करूंगा ।
दिनांक अंतर / समय की तुलना करने पर दिनांक अंतर को देखने के कई तरीके हैं, और अधिक। यहाँ "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
निम्नलिखित क्वेरी को वह सटीक सामग्री देनी चाहिए जिसकी आप तलाश कर रहे हैं।
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
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff
यह आपको वर्ष में दो तिथियों के बीच अंतर देता है
यहां (2017-2011) = परिणामस्वरूप 6
वाक्य - विन्यास:
DATEDIFF(interval, date1, date2)
इसके लिए इसका उपयोग करें 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)
तो यह मेरा जवाब नहीं है, लेकिन मैं इस तरह के रूप में अच्छी तरह से एक सवाल के लिए ऑनलाइन खोज के दौरान यह पाया। इस आदमी ने घंटे, मिनट और सेकंड की गणना करने के लिए एक प्रक्रिया निर्धारित की। लिंक और कोड:
--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'
)
प्रिंट डेटिफ़ (दूसरी, '2010-01-22 15: 29: 55.090', '2010-01-22 15: 30: 09.153')
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
बस सोचा था कि मैं इसका उल्लेख करूंगा।
क्रिएट फंक्शन 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:
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]
डेटपार्ट सबसे अच्छा काम करता है
पुस्तकें ऑनलाइन पर DateDiff देखें।
datediff
उत्तर मिल रहे हैं, लेकिन कोई भी आपको यह याद दिलाने के लिए नहीं लगता है कि पैरामीटर ऑर्डर के आधार पर आपको इससे नकारात्मक परिणाम मिल सकते हैं।