복붙노트

[SQL] SQL 서버에 두 개의 날짜 시간의 차이

SQL

SQL 서버에 두 개의 날짜 시간의 차이

SQL 서버에서 두 날짜 사이의 차이를 취할 수있는 방법이 있습니까?

예를 들어, 내 날짜는

그래서, 결과는 14.063 초해야합니다.

해결법

  1. ==============================

    1.참조 DateDiff에 대한 추가 다만주의해야 할 점은, 당신이 정확한 시간 범위를 찾고 있다면 그래서 문제에 따라, 당신은 당신이 당신의 단위로 지정한 경계를 통과 횟수를 계산합니다. 예를 들면

    참조 DateDiff에 대한 추가 다만주의해야 할 점은, 당신이 정확한 시간 범위를 찾고 있다면 그래서 문제에 따라, 당신은 당신이 당신의 단위로 지정한 경계를 통과 횟수를 계산합니다. 예를 들면

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

    이 스팬 2 일 순간에도, 2 월 월부터 경계를 넘어 때문에, 하나의 답을 제공, DATEDIFF의 값은 1을 반환 - 그것은 1 일의 경계를 넘어.

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

    1의 값을 부여, 다시, 그것은이 약 14초 그래서 비록 한 번 분 경계를 통과 단위로 분을 사용하는 경우는, 단일 분으로 반환됩니다.

  2. ==============================

    2.

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

    MSDN에 DATEDIFF에 따라 대체 "MyUnits"

  3. ==============================

    3.

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

    두 번째처럼, 당신은 차이를 얻으려면 다른 단위로 하루를 교체, 분 등

  4. ==============================

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

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

    1) 함수 DATEDIFF ()는 두 날짜 사이의 계산의 차이에 대한 책임, 결과는 첫 번째 매개 변수 (날짜 부분)에 지정된 "올해 분기 월 DAYOFYEAR 일 주 시간 분 초 밀리 초 마이크로 나노초", 수 :

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

    2) 당신은 어떤 날짜와 실제 날짜의 실제 시간과 계산의 차이를 얻을 수있는 함수 GETDATE ()를 사용할 수 있습니다 :

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

    3) 또 다른 중요한 기능은 하나의 기본 날짜에 양수 값) 또는 음의 값 빼기 ()을 (추가 할 수는 DATEDIFF의 같은 날짜 부분을 사용하여 날짜에 어떤 값을 변환하는 데 사용 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)
    

    ... 결과 0시 10분 38초 (638s = 600S + 38 일 = 10 분 38초) 인

    또 다른 예:

    select distinct convert(char(8),dateadd(s,datediff(s, CRDATE , GETDATE() ),'1900-1-1'),8) from sysobjects order by 1
    
  5. ==============================

    5.나는이 방법을 시도하고 일했다. 나는 SQL Server 버전 2016을 사용

    나는이 방법을 시도하고 일했다. 나는 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

  6. ==============================

    6.내부적으로 SQL 서버 날짜에 2 개 정수로 저장됩니다. 첫 번째 정수는 전 또는 기준일 (1900년 1월 1일) 이후 날짜의 수입니다. 클록 틱의 두 번째 정수 저장 자정 이후, 각 눈금은 1/300 초이다.

    내부적으로 SQL 서버 날짜에 2 개 정수로 저장됩니다. 첫 번째 정수는 전 또는 기준일 (1900년 1월 1일) 이후 날짜의 수입니다. 클록 틱의 두 번째 정수 저장 자정 이후, 각 눈금은 1/300 초이다.

    여기에 더 많은 정보

    이 때문에, 나는 종종 날짜 단순히를 빼지하는 것입니다 비교하는 간단한 방법을 찾을 수 있습니다. 이것은 내 사용 사례의 90 %를 처리합니다. 예를 들면,

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

    내가 일 이외의 단위로 답을해야 할 때, 나는 참조 DateDiff를 사용합니다.

  7. ==============================

    7.이 날짜의 차이를 보면하는 방법에는 여러 가지가 있으며, 더 많은 날짜 / 시간을 비교할 때. "SS : MM HH"저는 여기로 포맷 두 날짜 사이의 차이를 얻기 위해 무엇을 사용 :

    이 날짜의 차이를 보면하는 방법에는 여러 가지가 있으며, 더 많은 날짜 / 시간을 비교할 때. "SS : MM HH"저는 여기로 포맷 두 날짜 사이의 차이를 얻기 위해 무엇을 사용 :

    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시 0분 0초"로 표시.

    HH : MM : 당신이 기간이 긴 몇 일보다 할 수 있다는 예상되는 경우,이 코드는 D로 전환 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
    
  8. ==============================

    8.다음 쿼리는 당신이 찾고있는 정확한 재료를 제공해야합니다.

    다음 쿼리는 당신이 찾고있는 정확한 재료를 제공해야합니다.

    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

  9. ==============================

    9.좋아 우리 모두가 알고있는 대답은 DATEDIFF () 포함한다. 그러나 당신이 후 수 있습니다 절반 만 결과를 제공합니다. 당신이이 개 DATETIME 값의 분의 관점에서 사람이 읽을 수있는 형식으로 결과 및 초를 얻으려면?

    좋아 우리 모두가 알고있는 대답은 DATEDIFF () 포함한다. 그러나 당신이 후 수 있습니다 절반 만 결과를 제공합니다. 당신이이 개 DATETIME 값의 분의 관점에서 사람이 읽을 수있는 형식으로 결과 및 초를 얻으려면?

    변환 (), 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) 
    
  10. ==============================

    10.

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

    그것은 당신에게 올해의 두 날짜 사이의 차이를주는 것

    여기서 (2017년부터 2011년까지)의 결과로서 6 =

    통사론:

    DATEDIFF(interval, date1, date2)
    
  11. ==============================

    11.이 내 대답은 아니지만 난 그냥뿐만 아니라이 같은 질문에 대한 온라인 주위를 검색하는 동안이 발견 그래서. 이 사람은 계산 시간, 분, 초에 절차를 설정합니다. 링크 및 코드 :

    이 내 대답은 아니지만 난 그냥뿐만 아니라이 같은 질문에 대한 온라인 주위를 검색하는 동안이 발견 그래서. 이 사람은 계산 시간, 분, 초에 절차를 설정합니다. 링크 및 코드 :

    --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'
    )
    
  12. ==============================

    12.

    declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'
    
    select CAST((@dt2-@dt1) as time(0))
    
  13. ==============================

    13.인쇄 DATEDIFF (초 '2010-01-22 15 : 29 : 55.090', '2010-01-22 15 : 30 : 09.153')

    인쇄 DATEDIFF (초 '2010-01-22 15 : 29 : 55.090', '2010-01-22 15 : 30 : 09.153')

  14. ==============================

    14.

    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
    

    그냥 내가 그것을 말할 줄 알았는데.

  15. ==============================

    15.FUNCTION의 getDateDiffHours을 작성 (AS @fdate 날짜가 날짜 등 있는데, TDate @) RETURNS의 VARCHAR (50) 같이 BEGIN     DECLARE의 @cnt의 INT     DECLARE의 @cntDate의 날짜     DECLARE의 @dayDiff의 INT     DECLARE @dayDiffWk의 INT     DECLARE @hrsDiff의 소수 (18)

    FUNCTION의 getDateDiffHours을 작성 (AS @fdate 날짜가 날짜 등 있는데, TDate @) RETURNS의 VARCHAR (50) 같이 BEGIN     DECLARE의 @cnt의 INT     DECLARE의 @cntDate의 날짜     DECLARE의 @dayDiff의 INT     DECLARE @dayDiffWk의 INT     DECLARE @hrsDiff의 소수 (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'
    

    종료

  16. ==============================

    16.솔-1 :

    솔-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]
    

    날짜 부분은 잘 작동

  17. ==============================

    17.두 날짜 사이의 날짜 차이를 찾기 위해 트릭을 아래에 확인하시기 바랍니다

    두 날짜 사이의 날짜 차이를 찾기 위해 트릭을 아래에 확인하시기 바랍니다

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

    여기서 당신은 당신이 일 또는 월 또는 연도 또는 시간의 차이를 원하는대로 귀하의 요구 사항에 따라 변경할 수 있습니다.

  18. ==============================

    18.MM : SS DD에 대한이 사용 :

    MM : SS DD에 대한이 사용 :

    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) 
    
  19. ==============================

    19.온라인에 참조 DateDiff를 확인하십시오.

    온라인에 참조 DateDiff를 확인하십시오.

  20. ==============================

    20.나이 완벽하게 작동을 위해 변환 (VARCHAR (8) DATEADD (SECOND, DATEDIFF (SECOND, LogInTime, LogOutTime), 0), 114)

    나이 완벽하게 작동을 위해 변환 (VARCHAR (8) DATEADD (SECOND, DATEDIFF (SECOND, LogInTime, LogOutTime), 0), 114)

    그리고 출력은 HH : MM : SS 내 경우에 정확하게 표시됩니다.

  21. from https://stackoverflow.com/questions/2116540/difference-of-two-date-time-in-sql-server by cc-by-sa and MIT license