datetimeস্কেল সার্ভারে দু'জনের মধ্যে পার্থক্য নেওয়ার কোনও উপায় আছে কি ?
উদাহরণস্বরূপ, আমার তারিখগুলি
2010-01-22 15:29:55.0902010-01-22 15:30:09.153
সুতরাং, ফলাফল হওয়া উচিত 14.063 seconds।
datetimeস্কেল সার্ভারে দু'জনের মধ্যে পার্থক্য নেওয়ার কোনও উপায় আছে কি ?
উদাহরণস্বরূপ, আমার তারিখগুলি
2010-01-22 15:29:55.0902010-01-22 15:30:09.153সুতরাং, ফলাফল হওয়া উচিত 14.063 seconds।
উত্তর:
ডেটডিফ সম্পর্কে যোগ করার জন্য কেবল একটি সতর্কতা, এটি আপনাকে আপনার ইউনিট হিসাবে নির্দিষ্ট করা সীমানাটি কতবার ছাড়িয়েছে তা গণনা করে, তাই যদি আপনি একটি সুনির্দিষ্ট টাইমস্প্যান খুঁজছেন তবে সমস্যা হতে পারে। যেমন
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 সেকেন্ড হলেও, মিনিটগুলি ইউনিট হিসাবে ব্যবহার করার সময় এটি এক মিনিট হিসাবে ফিরে আসবে।
SELECT DATEDIFF (MyUnits, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')
এমএসডিএন- তে ডেটাডিআইএফ-এর উপর ভিত্তি করে "মাই ইউনাইটস" প্রতিস্থাপন করুন
আমি এমএস এসকিউএল সার্ভারের চারটি গুরুত্বপূর্ণ ফাংশন উল্লেখ করতে পারি যা খুব কার্যকর হতে পারে:
1) ফাংশন DATEDIFF () দুটি তারিখের মধ্যে পার্থক্য গণনা করার জন্য দায়বদ্ধ, ফলাফলটি প্রথম প্যারামিটারে ( ডেটপার্ট ) নির্দিষ্ট করে " বছরের ত্রৈমাসিক মাসের দিনফিয়ার দিন সপ্তাহের মিনিট দ্বিতীয় মিলি সেকেন্ড মাইক্রোসেকেন্ড ন্যানোসেকেন্ড " হতে পারে :
select datediff(day,'1997-10-07','2011-09-11')
2) আপনি সঠিক সময়টি পেতে এবং কিছু তারিখ এবং আসল তারিখের পার্থক্য গণনা করতে GETDATE () ফাংশনটি ব্যবহার করতে পারেন :
select datediff(day,'1997-10-07', getdate() )
৩) আরেকটি গুরুত্বপূর্ণ ফাংশন হ'ল ডেটএডিডিডি () , যা তারিখের সময়কালে কিছু তারিখের একই তারিখ পার্টটি ব্যবহার করে রূপান্তর করতে ব্যবহৃত হয় , যা আপনি (ইতিবাচক মান সহ) বা বিয়োগের তারিখটিতে (নেতিবাচক মান সহ) বিয়োগ করতে পারেন:
select DATEADD(day, 45, getdate()) -- actual datetime adding 45 days
select DATEADD( s,-638, getdate()) -- actual datetime subtracting 10 minutes and 38 seconds
৪) কনভার্ট () কনফিগার্ট () ফাংশনটি আপনার প্রয়োজন মতো তারিখটি ফর্ম্যাট করার জন্য তৈরি করা হয়েছিল, এটি প্যারাম্যাট্রিক ফাংশন নয়, তবে আপনি ফলাফলটির অংশটি আপনার প্রয়োজন মতো ফর্ম্যাট করতে ব্যবহার করতে পারেন:
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 ঠান্ডাটি সেকেন্ডে গণনা করা হবে এবং এই চারটি ফাংশনটির সাথে মেশানো একটি আকর্ষণীয় ফলাফল হ'ল দুটি তারিখের মধ্যে ফর্ম্যাট পার্থক্য হ'ল ঘন্টা, মিনিট এবং সেকেন্ড ( এইচ: মিমি: এসএস ) দেখানো :
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
আমি এইভাবে চেষ্টা করেছি এবং এটি কাজ করেছে। আমি এসকিউএল সার্ভার সংস্করণ 2016 ব্যবহার করেছি
SELECT DATEDIFF(MILLISECOND,'2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')/1000.00;
বিভিন্ন DATEDIFF ফাংশনগুলি হ'ল:
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');
সূত্র: 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)
এটি আপনাকে এরকম কিছু দেবে:
এইচ এইচ: এমএম
আপনি যদি আরও নির্ভুলতা চান তবে কেবলমাত্র বৃদ্ধি করুন VARCHAR()।
CONVERT(varchar(12), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114)
এইচ এইচ: এমএমএসএস.এমএস
অভ্যন্তরীণভাবে এসকিউএল সার্ভারের তারিখগুলি 2 পূর্ণসংখ্যা হিসাবে সংরক্ষণ করা হয়। প্রথম পূর্ণসংখ্যা হল বেসের তারিখের আগে বা পরে তারিখের সংখ্যা (1900/01/01)। দ্বিতীয় পূর্ণসংখ্যা মধ্যরাতের পরে ক্লক টিকের সংখ্যা সঞ্চয় করে, প্রতিটি টিকটি এক সেকেন্ডের 1/300।
এ কারণে, আমি প্রায়শই তারিখগুলির তুলনা করার সহজ উপায়টি হ'ল কেবল তাদের বিয়োগ করা। এটি আমার ব্যবহারের 90% ক্ষেত্রে পরিচালনা করে। যেমন,
select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...
যখন দিনগুলি ব্যতীত অন্য ইউনিটে আমার উত্তর প্রয়োজন তখন আমি ডেটডিফ ব্যবহার করব ।
তারিখের পার্থক্য দেখার জন্য বিভিন্ন উপায় রয়েছে এবং তারিখ / সময়গুলির তুলনা করার সময় আরও অনেক কিছু রয়েছে। "এইচএইচ: এমএম: এসএস" হিসাবে ফর্ম্যাট হওয়া দুটি তারিখের মধ্যে পার্থক্য পেতে আমি যা ব্যবহার করি তা এখানে:
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')
ডেটেডিফ ফাংশনটি দিয়ে আপনি যা করতে পারেন তার জন্য এমএসডিএন এর লিঙ্কটি এখানে। 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
ভেবেছিলাম আমি এটি উল্লেখ করব।
ফাংশন তৈরি করুনডেটডিফহর্স তৈরি করুন (@ তারিখের তারিখ হিসাবে ফেটেট) @ বার্তা ফেরত আসে
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'
শেষ
সল -১:
select
StartTime
, EndTime
, CONVERT(NVARCHAR,(EndTime-StartTime), 108) as TimeDiff
from
[YourTable]
সল -২:
select
StartTime
, EndTime
, DATEDIFF(hh, StartTime, EndTime)
, DATEDIFF(mi, StartTime, EndTime) % 60
from
[YourTable]
সল -৩:
select
DATEPART(hour,[EndTime]-[StartTime])
, DATEPART(minute,[EndTime]-[StartTime])
from
[YourTable]
ডেট পার্ট সবচেয়ে ভাল কাজ করে
আমার জন্য এটি পুরোপুরি রূপান্তর করেছে (বার্চার (8), ডেটএডডি (সেকেন্ড, ডেটেডিএফ (সেকেন্ড, লগইনটাইম, লগআউটটাইম), 0), 114)
এবং আউটপুটটি এইচএইচ: এমএম: এসএস যা আমার ক্ষেত্রে সঠিকভাবে দেখানো হয়েছে।
অনলাইন অনলাইনে ডেটডিফ পরীক্ষা করে দেখুন।
datediffউত্তর পেয়ে যাচ্ছেন তবে কোনওটিই আপনাকে মনে করিয়ে দেবে না যে আপনি প্যারামিটার ক্রমের উপর নির্ভর করে এর থেকে নেতিবাচক ফলাফল পেতে পারেন।