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


83

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

예를 들어, 내 날짜는

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

따라서 결과는 14.063 seconds.


2
모든 datediff답을 얻었지만 매개 변수 순서에 따라 부정적인 결과를 얻을 수 있다는 것을 상기시키는 것은 없습니다.
Pasi Savolainen

답변:


94

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 분으로 반환됩니다.


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

매우 유용 할 수있는 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

9

나는 이런 식으로 시도했고 효과가 있었다. 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


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

여기에 더 많은 정보

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

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

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


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)

계산 된 열에 사용했지만 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


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

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'

종료


1
질문에 따라 코드를 설명해 주시겠습니까?
user7294900 jul.

1

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가 가장 잘 작동합니다.


1

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

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

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


0

나를 위해 이것은 완벽하게 작동했습니다 .Convert (varchar (8), DATEADD (SECOND, DATEDIFF (SECOND, LogInTime, LogOutTime), 0), 114)

출력은 HH : MM : SS이며 제 경우에는 정확하게 표시됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.