복붙노트

[SQL] 범위 경계를 포함하는 "사이"합니까 MS SQL 서버?

SQL

범위 경계를 포함하는 "사이"합니까 MS SQL 서버?

예를 캔에 대한

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

5 선택하고 10 그들은 범위에서 제외됩니다?

해결법

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

    1.사이에 연산자가 포함됩니다.

    사이에 연산자가 포함됩니다.

    온라인에서 :

    날짜 시간주의 할

    주의 : 날짜 시간으로 당신은 조심해야합니다; 단지 날짜가 주어진다면 그 값은 당일 자정으로한다; 피할 종료일 내 시간을 누락 또는 여러 범위에서 자정에서 다음날의 데이터 캡처를 반복에, 최종 날짜는 날짜에 다음 날 자정 전에 3 밀리 초해야합니다. 3 밀리 어떤 이것보다 덜하고 값이 다음 날 자정까지 반올림됩니다 때문이다.

    예를 들면 2016년 6월 내에서 모든 값을 얻기 위해 당신은 실행해야 할 것입니다 :

    여기서 DATEADD 및 '20160601'을 사이 myDateTime (밀리 초, -3, '20160701')

    여기서 myDateTime '20160601 00 : 00 : 00.000'내지 '20160630 23 : 59 : 59.997'

    날짜에서 3 밀리 빼면 3 명 MS 윈도우에서 행을 누락 당신이 취약 떠날 것이다. 올바른 솔루션은 단순한 하나입니다 :

    where myDateTime >= '20160601' AND myDateTime < '20160701'
    
  2. ==============================

    2.날짜 사이에 사용하는 경우 네,하지만 조심하세요.

    날짜 사이에 사용하는 경우 네,하지만 조심하세요.

    BETWEEN '20090101' AND '20090131'
    

    정말, 자정으로 해석됩니다 또는

    BETWEEN '20090101 00:00:00' AND '20090131 00:00:00'
    

    그래서 월 31 일 하루 동안 발생 아무것도 그리워합니다. 이 경우에, 당신은 사용해야합니다 :

    myDate >= '20090101 00:00:00' AND myDate < '20090201 00:00:00'  --CORRECT!
    

    또는

    BETWEEN '20090101 00:00:00' AND '20090131 23:59:59' --WRONG! (see update!)
    

    UPDATE : 59 : 이는 20,090,101 23 늦어도 날짜 시간과 하루의 마지막 초 이내 기록이 전적으로 가능 59.997!

    이러한 이유로, (firstday) AND (LASTDAY 23시 59분 59초) 접근 방식 사이의 권장되지 않습니다.

    MyDate가> = (firstday) AND MyDate가 <(LASTDAY + 1) 접근을 대신 사용한다.

    여기에이 문제에 대한 좋은 기사.

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

    3.SQL 서버 2008에서 실제 예.

    SQL 서버 2008에서 실제 예.

    소스 데이터 :

    ID    Start
    1     2010-04-30 00:00:01.000
    2     2010-04-02 00:00:00.000
    3     2010-05-01 00:00:00.000
    4     2010-07-31 00:00:00.000
    

    질문:

    SELECT
        *
    FROM
        tbl
    WHERE
        Start BETWEEN '2010-04-01 00:00:00' AND '2010-05-01 00:00:00'
    

    결과 :

    ID    Start
    1     2010-04-30 00:00:01.000
    2     2010-04-02 00:00:00.000
    

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

    4.이 충돌, 정말 다음 DB 그것을 할 수 있도록 시도하고 코드에서 하루를 추가 처리하지 않으려면 ..

    이 충돌, 정말 다음 DB 그것을 할 수 있도록 시도하고 코드에서 하루를 추가 처리하지 않으려면 ..

    myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')
    

    당신은 시간의 부분을 포함 할 경우 메이크업을 확인 자정를 참조합니다. 그렇지 않으면 당신은 단순히 시간을 생략 할 수 있습니다 :

    myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')
    

    그것에 대해하지를 우려하고있다.

  5. ==============================

    5.

    test_expression [ NOT ] BETWEEN begin_expression AND end_expression
    
  6. ==============================

    6.컬럼 데이터 유형이 날짜 인 경우에 당신은이 날짜에서 시간을 제거하고 날짜 범위 사이에서만 비교하기 위해 다음을 수행 할 수 있습니다.

    컬럼 데이터 유형이 날짜 인 경우에 당신은이 날짜에서 시간을 제거하고 날짜 범위 사이에서만 비교하기 위해 다음을 수행 할 수 있습니다.

    where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)
    
  7. ==============================

    7.그것은 경계를 포함 않습니다.

    그것은 경계를 포함 않습니다.

    declare @startDate date = cast('15-NOV-2016' as date) 
    declare @endDate date = cast('30-NOV-2016' as date)
    create table #test (c1 date)
    insert into #test values(cast('15-NOV-2016' as date))
    insert into #test values(cast('20-NOV-2016' as date))
    insert into #test values(cast('30-NOV-2016' as date))
    select * from #test where c1 between @startDate and @endDate
    drop table #test
    RESULT    c1
    2016-11-15
    2016-11-20
    2016-11-30
    
    
    declare @r1 int  = 10
    declare @r2 int  = 15
    create table #test1 (c1 int)
    insert into #test1 values(10)
    insert into #test1 values(15)
    insert into #test1 values(11)
    select * from #test1 where c1 between @r1 and @r2
    drop table #test1
    RESULT c1
    10
    11
    15
    
  8. ==============================

    8.나는 항상 이것을 사용했습니다 :

    나는 항상 이것을 사용했습니다 :

    WHERE startDate를 AND BETWEEN MyDate가 (endDate가 + 1)

  9. from https://stackoverflow.com/questions/749615/does-ms-sql-servers-between-include-the-range-boundaries by cc-by-sa and MIT license