복붙노트

[SQL] 어떻게 SQL Server의 시간을 비교할 수 있습니까?

SQL

어떻게 SQL Server의 시간을 비교할 수 있습니까?

나는 SQL 쿼리에서 날짜 필드에 시간을 비교하기 위해 노력하고있어,하지만 잘 모르겠어요. 나는 날짜 부분, 그냥 시간 부분을 비교하고 싶지 않아요.

나는이 일을 해요 :

SELECT timeEvent 
FROM tbEvents 
WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)

이 맞습니까?

내가 8시 0분 0초가 작거나 큰 7시 30분 0초 이상 인 경우 알 필요가 내가 날짜, 그냥 시간 부분을 비교 싶지 않기 때문에 나는 이것을 부탁 해요.

감사!

해결법

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

    1.날짜는 각 행의 문자열로 변환되기 때문에 귀하의 비교 의지의 작품은하지만 속도가 느려질 수 있습니다. 효율적으로 두 시간 부분을 비교하기 위해 시도 :

    날짜는 각 행의 문자열로 변환되기 때문에 귀하의 비교 의지의 작품은하지만 속도가 느려질 수 있습니다. 효율적으로 두 시간 부분을 비교하기 위해 시도 :

    declare @first datetime
    set @first = '2009-04-30 19:47:16.123'
    declare @second datetime
    set @second = '2009-04-10 19:47:16.123'
    
    select (cast(@first as float) - floor(cast(@first as float))) -
           (cast(@second as float) - floor(cast(@second as float)))
           as Difference
    

    긴 설명 : SQL 서버의 날짜가 부동 소수점 숫자로 저장됩니다. 소수점 앞에있는 숫자는 날짜를 나타냅니다. 소수점 뒤의 숫자는 시간을 나타냅니다.

    그래서 여기 예를 들어 날짜는 다음과 같습니다

    declare @mydate datetime
    set @mydate = '2009-04-30 19:47:16.123'
    

    의는 float로 변환 보자 :

    declare @myfloat float
    set @myfloat = cast(@mydate as float)
    select @myfloat
    -- Shows 39931,8244921682
    

    이제 즉, 숫자 후 시간을 참여 :

    set @myfloat = @myfloat - floor(@myfloat) 
    select @myfloat
    -- Shows 0,824492168212601
    

    날짜 시간에 다시 변환 :

    declare @mytime datetime
    set @mytime = convert(datetime,@myfloat)
    select @mytime
    -- Shows 1900-01-01 19:47:16.123
    

    1900-01-01 그냥 "제로"날짜입니다; 당신은 단지 시간 예를 포맷 (108)에 대한 지정 변환과 시간 부분을 표시 할 수 있습니다 :

    select convert(varchar(32),@mytime,108)
    -- Shows 19:47:16
    

    그들은 기본적으로 같은 방법으로 저장되어 있기 때문에 날짜와 플로트 사이의 변환은 꽤 빠르다.

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

    2.

    convert(varchar(5), thedate, 108) between @leftTime and @rightTime
    

    설명:

    당신이 VARCHAR이있는 경우 (5) 당신은 HH를 얻을 것이다 : mm를

    당신이 VARCHAR이있는 경우 (8) 당신은 HH를 얻을 : mm의 SS를

    108 개 취득 SQL 날짜 만 시간

    @leftTime 및 @rightTime 비교하려면 두 변수

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

    3.당신은 SQL 서버 2008을 사용하는 경우, 당신은이 작업을 수행 할 수 있습니다 :

    당신은 SQL 서버 2008을 사용하는 경우, 당신은이 작업을 수행 할 수 있습니다 :

    WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)
    

    다음은 전체 테스트는 다음과 같습니다

    DECLARE @tbEvents TABLE (
        timeEvent   int      IDENTITY,
        startHour   datetime
    )
    
    INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 0, GETDATE())
    INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 1, GETDATE())
    INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 2, GETDATE())
    INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 3, GETDATE())
    INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 4, GETDATE())
    INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 5, GETDATE())
    
    --SELECT * FROM @tbEvents
    
    DECLARE @startTime  datetime
    
    SET @startTime = DATEADD(mi, 65, GETDATE())
    
    SELECT
        timeEvent,
        CONVERT(time(0), startHour)  AS 'startHour',
        CONVERT(time(0), @startTime) AS '@startTime'
    FROM @tbEvents
    WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)
    
  4. ==============================

    4.

    if (cast('2012-06-20 23:49:14.363' as time) between 
        cast('2012-06-20 23:49:14.363' as time) and 
        cast('2012-06-20 23:49:14.363' as time))
    
  5. ==============================

    5.그냥 트릭을해야 할 시간 변환 날짜를 변경 :

    그냥 트릭을해야 할 시간 변환 날짜를 변경 :

    SELECT timeEvent 
    FROM tbEvents 
    WHERE convert(time, startHour) >= convert(time, @startHour)
    
  6. ==============================

    6.내가 지금까지 솔루션으로 언급 한 하나 (아마도 작은) 문제는 그들이 모든 비교를 처리하는 함수 호출을 요구하는 것처럼 보인다는 것이다. 및 인덱스를 사용할 수 없습니다 - 쿼리 엔진이 전체 테이블을 할 필요가 있다고이 방법은 후에있는 행을 추구하는 검사합니다. 테이블이 특히 큰 얻을하지 않을 경우,이 아마 어떤 부정적인 영향을 없을 것이다 (그리고 당신은 행복이 답변을 무시할 수 있습니다).

    내가 지금까지 솔루션으로 언급 한 하나 (아마도 작은) 문제는 그들이 모든 비교를 처리하는 함수 호출을 요구하는 것처럼 보인다는 것이다. 및 인덱스를 사용할 수 없습니다 - 쿼리 엔진이 전체 테이블을 할 필요가 있다고이 방법은 후에있는 행을 추구하는 검사합니다. 테이블이 특히 큰 얻을하지 않을 경우,이 아마 어떤 부정적인 영향을 없을 것이다 (그리고 당신은 행복이 답변을 무시할 수 있습니다).

    반면에, 테이블이 상당히 크다고 얻을 수, 경우 쿼리의 성능이 저하 될 수 있습니다.

    난 당신이 날짜 부분을 비교하지 않으 밝혔다 알 -하지만 날짜 컬럼에 저장되는 실제 날짜가, 또는 당신은 단지 시간을 저장하는 데 사용하고 있습니까? 후자의 경우, 단순 비교 연산자를 사용할 수 있으며,이 두 CPU 사용량을 줄이고, 사용 통계 및 인덱스 (있는 경우) 쿼리를 최적화하는 쿼리 엔진을 수 있습니다.

    그러나, 날짜 열이 이벤트의 날짜와 시간을 저장하는 데 사용되는 경우,이 분명히 작동하지 않습니다. 이 경우, 응용 프로그램 및 테이블 구조를 수정할 수있는 경우 두 개의 별도의 날짜 컬럼에 날짜와 시간을 분리, 또는 인덱싱 된 뷰를 만들 것을 선택 모든 소스 테이블의 (관련) 열, 그리고 포함 된 더 열 대신 뷰를 쿼리하는 응용 프로그램을 변경 - 시간 요소는 (이 계산에 이전 답변 중 하나를 사용)를 검색하고 싶습니다.

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

    7.플로트를 사용하면 작동하지 않습니다.

    플로트를 사용하면 작동하지 않습니다.

    DECLARE @t1 datetime, @t2 datetime
    SELECT @t1 = '19000101 23:55:00', @t2 = '20001102 23:55:00'
    SELECT CAST(@t1 as float) - floor(CAST(@t1 as float)), CAST(@t2 as float) - floor(CAST(@t2 as float))
    

    당신은 값이 동일한 (SQL 서버 2005)하지 않은 것을 볼 수 있습니다. 내가있는 내가 23시 55분 0초 및 00:05:00 사이 인의 현재 시간을 비교했다 (전체 방법 자세한 내용을 가지고) 자정의 주위에 시간을 확인하기 위해이 방법을 사용하고 싶었다.

  8. ==============================

    8.다른 답변에 추가 :

    다른 답변에 추가 :

    당신은 날짜에서 날짜를 트리밍하는 기능을 만들 수 있습니다

    CREATE FUNCTION dbo.f_trimdate (@dat datetime) RETURNS DATETIME AS BEGIN
        RETURN CONVERT(DATETIME, CONVERT(FLOAT, @dat) - CONVERT(INT, @dat))
    END
    

    그래서 이건:

    DECLARE @dat DATETIME
    SELECT @dat = '20080201 02:25:46.000'
    SELECT dbo.f_trimdate(@dat)
    

    반환 1900-01-01 02 : 25 : 46.000

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

    9.사용 DATEPART 기능 : DATEPART (날짜 부분, 날짜)

    사용 DATEPART 기능 : DATEPART (날짜 부분, 날짜)

    예컨대 #

    이보다 쉽게 ​​비교할 수 분 안에 당신에게 하루의 총 시간을 제공 할 것입니다.

    날짜가 동일 위하여려고하는 경우에 당신은 그렇지 않으면 당신은 위와 같이 날짜를 제거해야합니다, 참조 DateDiff을 사용할 수 있습니다

  10. ==============================

    10.당신은 날짜의 2 개 변수를 생성하고 필요 비교하는 날짜의 시간을 설정할 수 있습니다.

    당신은 날짜의 2 개 변수를 생성하고 필요 비교하는 날짜의 시간을 설정할 수 있습니다.

    declare  @date1 datetime;
    declare  @date2 datetime;
    
    select   @date1 = CONVERT(varchar(20),CONVERT(datetime, '2011-02-11 08:00:00'), 114)
    select   @date2 = CONVERT(varchar(20),GETDATE(), 114)
    

    날짜가 "1900-01-01"당신이 그것을 비교할 수있을 것입니다

    if @date1 <= @date2
       print '@date1 less then @date2'
    else
       print '@date1 more then @date2'
    
  11. ==============================

    11.

    SELECT timeEvent 
      FROM tbEvents 
     WHERE CONVERT(VARCHAR,startHour,108) >= '01:01:01'
    

    이것은 ": MM : SS HH"입니다 스타일 (108)를 사용하여 VARCHAR로 현재 날짜 / 시간을 변환하는 SQL 서버를 알려줍니다. 필요한 경우 01 '하는 또 다른 변환 : 01 : 당신은 또한 '01 교체 할 수 있습니다.

  12. ==============================

    12.난 당신이 DATEPART ( '시간', 날짜)을 사용하려는 생각합니다.

    난 당신이 DATEPART ( '시간', 날짜)을 사용하려는 생각합니다.

    참조는 여기에 있습니다 :

    http://msdn.microsoft.com/en-us/library/ms174420.aspx

  13. ==============================

    13.나는 (날짜는 정수 = 하루 분수 = 시간의 float입니다) 저장 내부에 의존 사랑하지 않아,하지만 난 대답 조니 D. 카노과 같은 일을한다. 이것은 내가 그것을 알고있는 DB의 모든 DEVS 방법입니다. 확실히 문자열로 변환하지 않습니다. 당신이 부동 / int로서 처리 피해야 경우, 최선의 선택은 당겨하는 것입니다시 / 분 / 초 / DATEPART와 밀리 초 ()

    나는 (날짜는 정수 = 하루 분수 = 시간의 float입니다) 저장 내부에 의존 사랑하지 않아,하지만 난 대답 조니 D. 카노과 같은 일을한다. 이것은 내가 그것을 알고있는 DB의 모든 DEVS 방법입니다. 확실히 문자열로 변환하지 않습니다. 당신이 부동 / int로서 처리 피해야 경우, 최선의 선택은 당겨하는 것입니다시 / 분 / 초 / DATEPART와 밀리 초 ()

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

    14.나는 당신의 startHour 열을 가정하고 있는데 @startHour 변수는 모두 DATETIME이다; 이 경우, 당신은 문자열로 변환해야합니다 :

    나는 당신의 startHour 열을 가정하고 있는데 @startHour 변수는 모두 DATETIME이다; 이 경우, 당신은 문자열로 변환해야합니다 :

    SELECT timeEvent
    FROM tbEvents
    WHERE convert(VARCHAR(8), startHour, 8) >= convert(VARCHAR(8), @startHour, 8)
    
  15. ==============================

    15.쿼리는 당신에게 날짜의 시간을 제공 이하

    쿼리는 당신에게 날짜의 시간을 제공 이하

    select DateAdd(day,-DateDiff(day,0,YourDateTime),YourDateTime) As NewTime from Table
    
  16. ==============================

    16.@ronmurp 유효한 우려를 제기 - 캐스트 / 바닥 접근 방식은 같은 시간에 대해 다른 값을 반환합니다. @littlechris로하고, 분, 초, 밀리 초 구성 요소가 시간에 해결할 수있는 문제는, 당신은 하루의 시작부터 밀리 초 수를 계산하기 위해이 기능을 사용할 수있는보다 일반적인 솔루션에 대한 대답의 라인을 따라.

    @ronmurp 유효한 우려를 제기 - 캐스트 / 바닥 접근 방식은 같은 시간에 대해 다른 값을 반환합니다. @littlechris로하고, 분, 초, 밀리 초 구성 요소가 시간에 해결할 수있는 문제는, 당신은 하루의 시작부터 밀리 초 수를 계산하기 위해이 기능을 사용할 수있는보다 일반적인 솔루션에 대한 대답의 라인을 따라.

    Create Function [dbo].[MsFromStartOfDay] ( @DateTime datetime )
    Returns int
    As
      Begin
          Return (
                   ( Datepart( ms , @DateTime ) ) +
                   ( Datepart( ss , @DateTime ) * 1000 ) +
                   ( Datepart( mi , @DateTime ) * 1000 * 60 ) +
                   ( Datepart( hh , @DateTime ) * 1000 * 60 * 60 )
                  )
      End
    

    나는 그것이 같은 시간에 두 개의 서로 다른 날짜에 동일한 int를 돌려 것을 확인했습니다

    declare @first datetime
    set @first = '1900-01-01 23:59:39.090'
    declare @second datetime
    set @second = '2000-11-02 23:56:39.090'
    Select dbo.MsFromStartOfDay( @first )
    Select dbo.MsFromStartOfDay( @second )
    

    이 솔루션은 항상 당신이 기대할 수있는 INT를 반환하지 않습니다. 예를 들어, SQL 2005에서 아래 시도 대신 '556'의 '557'로 끝나는 int를 반환합니다.

    set @first = '1900-01-01 23:59:39.556'
    set @second = '2000-11-02 23:56:39.556'
    

    나는이 플로트로 저장 날짜 시간의 본질과 관련이있다 생각합니다. 당신은 여전히하지만, 두 수를 비교할 수 있습니다. 내가 DateTime.Now ()를 사용하여 .NET에서 캡처 및 SQL에 저장된 날짜 시간의 "진짜"데이터 세트에이 방법을 사용할 때, 나는 계산이 정확한 사실을 발견했습니다.

  17. from https://stackoverflow.com/questions/807909/how-can-i-compare-time-in-sql-server by cc-by-sa and MIT license