programing tip

SQL Server에서 두 날짜 시간의 차이

itbloger 2020. 10. 21. 07:45
반응형

SQL Server에서 두 날짜 시간의 차이


datetimeSQL Server에서 두 가지 차이점을 취하는 방법이 있습니까?

예를 들어, 내 날짜는

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

따라서 결과는 14.063 seconds.


DateDiff에 대해 추가 할주의 사항은 단위로 지정한 경계를 통과 한 횟수를 계산하므로 정확한 시간 범위를 찾는 경우 문제가 발생할 수 있습니다. 예 :

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

1 월에서 2 월까지 경계를 넘었 기 때문에 1의 답을 제공합니다. 따라서 범위가 2 일이더라도 datediff는 1의 값을 반환합니다. 1 개의 날짜 경계를 넘었습니다.

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

1의 값을 다시 부여하면 분 경계를 한 번 통과 했으므로 약 14 초이지만 Minutes를 단위로 사용하면 1 분으로 반환됩니다.


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

MSDN 에서 DATEDIFF를 기반으로 "MyUnits"로 대체


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

day차이를 얻고 싶은 다른 단위 (예 second: minute등)로 교체하십시오 .


매우 유용 할 수있는 MS SQL Server의 네 가지 중요한 기능을 언급 할 수 있습니다.

1) DATEDIFF () 함수 는 두 날짜 간의 차이를 계산합니다. 결과 는 첫 번째 매개 변수 ( datepart ) 에 지정된 " 년 분기 월 요일 요일 주시 분 초 밀리 초 마이크로 초 나노초 "일 있습니다.

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

2) GETDATE () 함수를 사용하여 실제 시간을 얻고 일부 날짜와 실제 날짜의 차이를 계산할 수 있습니다.

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

3) 또 다른 중요한 함수는 DATEADD () 이며, datediff 의 동일한 datepart사용하여 datetime의 일부 값을 변환하는 데 사용 되며 하나의 기준 날짜에 더하거나 (양수 값 사용) 빼거나 (음수 값 사용) 할 수 있습니다.

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 콜드 (cold)는 초 단위로 계산되며이 네 가지 함수를 혼합 한 흥미로운 결과 는 두 날짜 사이 의 형식화 된 차이 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 Server 버전 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


SQL Server에서 내부적으로 날짜는 2 개의 정수로 저장됩니다. 첫 번째 정수는 기준 날짜 (1900/01/01) 전후의 날짜 수입니다. 두 번째 정수는 자정 이후의 클럭 틱 수를 저장하며 각 틱은 1/300 초입니다.

여기에 더 많은 정보

이 때문에 날짜를 비교하는 가장 간단한 방법은 단순히 날짜를 빼는 것입니다. 이것은 내 사용 사례의 90 %를 처리합니다. 예 :

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

일 이외의 단위로 답변이 필요한 경우 DateDiff 를 사용 합니다.


날짜 차이를 보는 방법에는 여러 가지가 있으며 날짜 / 시간을 비교할 때 더 많은 방법이 있습니다. 다음은 "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)

계산 된 열에 사용했지만 UDF 또는 쿼리 계산으로 간단하게 다시 작성할 수 있습니다. 이 논리는 소수 초를 내림합니다. 00 : 00.00 ~ 00 : 00.999는 0 초로 간주되며 "00:00:00"으로 표시됩니다.

기간이 며칠 이상일 것으로 예상되는 경우이 코드는 필요할 때 D : HH : MM : SS 형식으로 전환됩니다.

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

다음은 datediff 함수로 할 수있는 모든 작업에 대한 MSDN의 링크입니다. https://msdn.microsoft.com/en-us/library/ms189794.aspx


좋아요, 우리 모두는 대답이 포함된다는 것을 압니다 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


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

연도의 두 날짜 사이에 차이가 있습니다.

결과적으로 여기 (2017-2011) = 6

통사론:

DATEDIFF(interval, date1, date2)

그래서 이것은 내 대답이 아니지만 온라인에서 이와 같은 질문을 검색하면서 이것을 찾았습니다. 이 사람은 시간, 분, 초를 계산하는 절차를 설정했습니다. 링크 및 코드 :

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

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

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

PRINT DATEDIFF (초, '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

내가 언급 할 줄 알았는데.


CREATE FUNCTION getDateDiffHours (@fdate AS datetime, @ tdate as datetime) 반환 varchar (50) AS BEGIN DECLARE @cnt int DECLARE @cntDate datetime DECLARE @dayDiff int DECLARE @dayDiffWk int DECLARE @hrsDiff decimal (18)

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'

종료


Sol-1 :

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

Sol-2 :

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

Sol-3 :

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

Datepart가 가장 잘 작동합니다.


두 날짜 간의 날짜 차이를 찾으려면 아래 트릭을 확인하십시오.

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

일, 월 또는 년 또는 시간의 차이를 원할 때 요구 사항에 따라 변경할 수 있습니다.


온라인 설명서에서 DateDiff를 확인하십시오.


For Me This worked Perfectly Convert(varchar(8),DATEADD(SECOND,DATEDIFF(SECOND,LogInTime,LogOutTime),0),114)

and the Output is HH:MM:SS which is shown accurately in my case.


Use This for 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) 

참고URL : https://stackoverflow.com/questions/2116540/difference-of-two-date-time-in-sql-server

반응형