স্কিএল সার্ভারে দুটি তারিখের সময়ের পার্থক্য


84

datetimeস্কেল সার্ভারে দু'জনের মধ্যে পার্থক্য নেওয়ার কোনও উপায় আছে কি ?

উদাহরণস্বরূপ, আমার তারিখগুলি

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

সুতরাং, ফলাফল হওয়া উচিত 14.063 seconds


4
আপনি সমস্ত datediffউত্তর পেয়ে যাচ্ছেন তবে কোনওটিই আপনাকে মনে করিয়ে দেবে না যে আপনি প্যারামিটার ক্রমের উপর নির্ভর করে এর থেকে নেতিবাচক ফলাফল পেতে পারেন।
প্যাসি সাওলাইনেন

উত্তর:


94

ডেটডিফ সম্পর্কে যোগ করার জন্য কেবল একটি সতর্কতা, এটি আপনাকে আপনার ইউনিট হিসাবে নির্দিষ্ট করা সীমানাটি কতবার ছাড়িয়েছে তা গণনা করে, তাই যদি আপনি একটি সুনির্দিষ্ট টাইমস্প্যান খুঁজছেন তবে সমস্যা হতে পারে। যেমন

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 সেকেন্ড হলেও, মিনিটগুলি ইউনিট হিসাবে ব্যবহার করার সময় এটি এক মিনিট হিসাবে ফিরে আসবে।



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

dayঅন্যান্য ইউনিটগুলির সাথে প্রতিস্থাপন করুন আপনি যেমন second, minuteইত্যাদির মধ্যে পার্থক্য পেতে চান


16

আমি এমএস এসকিউএল সার্ভারের চারটি গুরুত্বপূর্ণ ফাংশন উল্লেখ করতে পারি যা খুব কার্যকর হতে পারে:

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

9

আমি এইভাবে চেষ্টা করেছি এবং এটি কাজ করেছে। আমি এসকিউএল সার্ভার সংস্করণ 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


7

ঠিক আছে আমরা সবাই জানি উত্তর জড়িত 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) 

এইচ এইচ: এমএমএসএস.এমএস


5

অভ্যন্তরীণভাবে এসকিউএল সার্ভারের তারিখগুলি 2 পূর্ণসংখ্যা হিসাবে সংরক্ষণ করা হয়। প্রথম পূর্ণসংখ্যা হল বেসের তারিখের আগে বা পরে তারিখের সংখ্যা (1900/01/01)। দ্বিতীয় পূর্ণসংখ্যা মধ্যরাতের পরে ক্লক টিকের সংখ্যা সঞ্চয় করে, প্রতিটি টিকটি এক সেকেন্ডের 1/300।

আরও তথ্য এখানে

এ কারণে, আমি প্রায়শই তারিখগুলির তুলনা করার সহজ উপায়টি হ'ল কেবল তাদের বিয়োগ করা। এটি আমার ব্যবহারের 90% ক্ষেত্রে পরিচালনা করে। যেমন,

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

যখন দিনগুলি ব্যতীত অন্য ইউনিটে আমার উত্তর প্রয়োজন তখন আমি ডেটডিফ ব্যবহার করব


6
মনে রাখবেন, এই শুধুমাত্র অভিধান প্রাচীন প্রযোজ্য DATETIMEধরন, না DATE, TIMEঅথবা DATETIME2। এছাড়াও, প্রত্যাবর্তিত মানটি অন্যটি হবে DATETIME, সুতরাং আপনাকে তারিখের মধ্যে মানব-পঠনযোগ্য সংখ্যক দিনের জন্য কাস্ট করতে হবে।

5

তারিখের পার্থক্য দেখার জন্য বিভিন্ন উপায় রয়েছে এবং তারিখ / সময়গুলির তুলনা করার সময় আরও অনেক কিছু রয়েছে। "এইচএইচ: এমএম: এসএস" হিসাবে ফর্ম্যাট হওয়া দুটি তারিখের মধ্যে পার্থক্য পেতে আমি যা ব্যবহার করি তা এখানে:

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')

ডেটেডিফ ফাংশনটি দিয়ে আপনি যা করতে পারেন তার জন্য এমএসডিএন এর লিঙ্কটি এখানে। 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

ফাংশন তৈরি করুনডেটডিফহর্স তৈরি করুন (@ তারিখের তারিখ হিসাবে ফেটেট) @ বার্তা ফেরত আসে

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'

শেষ


4
প্রশ্ন অনুযায়ী আপনার কোড ব্যাখ্যা করতে পারেন?
ব্যবহারকারী7294900

1

সল -১:

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]

ডেট পার্ট সবচেয়ে ভাল কাজ করে


1

দুটি তারিখের মধ্যে তারিখের পার্থক্য জানতে দয়া করে নীচের কৌশলটি দেখুন

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

আপনি নিজের প্রয়োজন অনুসারে পরিবর্তন করতে পারেন যেখানে আপনি দিন বা মাস বা বছর বা সময়ের পার্থক্য চান।


0

আমার জন্য এটি পুরোপুরি রূপান্তর করেছে (বার্চার (8), ডেটএডডি (সেকেন্ড, ডেটেডিএফ (সেকেন্ড, লগইনটাইম, লগআউটটাইম), 0), 114)

এবং আউটপুটটি এইচএইচ: এমএম: এসএস যা আমার ক্ষেত্রে সঠিকভাবে দেখানো হয়েছে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.