[SQL] 범위 경계를 포함하는 "사이"합니까 MS SQL 서버?
SQL범위 경계를 포함하는 "사이"합니까 MS SQL 서버?
예를 캔에 대한
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
5 선택하고 10 그들은 범위에서 제외됩니다?
해결법
-
==============================
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.날짜 사이에 사용하는 경우 네,하지만 조심하세요.
날짜 사이에 사용하는 경우 네,하지만 조심하세요.
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.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.이 충돌, 정말 다음 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.
test_expression [ NOT ] BETWEEN begin_expression AND end_expression
-
==============================
6.컬럼 데이터 유형이 날짜 인 경우에 당신은이 날짜에서 시간을 제거하고 날짜 범위 사이에서만 비교하기 위해 다음을 수행 할 수 있습니다.
컬럼 데이터 유형이 날짜 인 경우에 당신은이 날짜에서 시간을 제거하고 날짜 범위 사이에서만 비교하기 위해 다음을 수행 할 수 있습니다.
where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)
-
==============================
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.나는 항상 이것을 사용했습니다 :
나는 항상 이것을 사용했습니다 :
WHERE startDate를 AND BETWEEN MyDate가 (endDate가 + 1)
from https://stackoverflow.com/questions/749615/does-ms-sql-servers-between-include-the-range-boundaries by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] JPQL IN 절 : 자바 배열 (또는 목록, 설정 ...)? (0) | 2020.04.17 |
---|---|
[SQL] 영구적으로 설정 PostgreSQL을 스키마 경로 (0) | 2020.04.17 |
[SQL] 단지 SQL을 사용하여 SQL Server 2005의 이미지 필드에 그림 삽입 (0) | 2020.04.17 |
[SQL] DISTINCT를 통해 여러 열을 계산 (0) | 2020.04.17 |
[SQL] 감사 테이블에 SQL 서버의 로그 레코드 변경 (0) | 2020.04.17 |