[SQL] 절 "과"MySQL을 포함하지 않음?
SQL절 "과"MySQL을 포함하지 않음?
내가 절 사이에 쿼리를 실행하면 끝 값을 제외 할 것으로 보인다. 예를 들면 :
select * from person where dob between '2011-01-01' and '2011-01-31'
이 '2011-01-30'까지 '2011-01-01'에서 DOB 모든 결과를 얻는다; 기록을 건너 뛰는 것은 DOB는 '2011-01-31'입니다. 사람이 쿼리가 이런 식으로 행동 이유를 설명 할 수, 나는 DOB는 '2011-01-31'이다는 기록을 포함하도록 수정 수있는 방법? (그는 사용자가 선택한 때문에 종료 날짜에 1을 가산하지 않고).
해결법
-
==============================
1.필드 DOB 아마 시간 구성 요소를 가지고있다.
필드 DOB 아마 시간 구성 요소를 가지고있다.
그것을 잘라하려면 :
select * from person where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'
-
==============================
2.MySQL의-매뉴얼에서 :
MySQL의-매뉴얼에서 :
-
==============================
3.문제는 2011-01-31 정말 2011-01-31 00:00:00 점이다. 즉, 하루의 시작입니다. 낮에는 모든 것이 포함되어 있지 않습니다.
문제는 2011-01-31 정말 2011-01-31 00:00:00 점이다. 즉, 하루의 시작입니다. 낮에는 모든 것이 포함되어 있지 않습니다.
-
==============================
4.
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'
-
==============================
5.당신은 당신의 쿼리에서 날짜 형 또는 날짜 시간 유형을 현장 참조하고 있습니까?
당신은 당신의 쿼리에서 날짜 형 또는 날짜 시간 유형을 현장 참조하고 있습니까?
당신이 정말 날짜 형식을 사용되어야 날짜 시간 유형을 사용할 때이 설명하는 행동의 일반적인 원인이다. 당신이 정말로 시간 사람이 태어난 알 필요가없는 즉, 그냥 날짜 형식을 사용합니다.
마지막 날이 결과에 포함되지 않는 이유는 쿼리는 쿼리에 지정하지 않았다 날짜의 시간 부분을 가정하고있는 방법입니다.
즉 : 귀하의 질의는 2011-01-30와 2011-01-31 사이 자정까지로 해석되고 있지만, 데이터는 언젠가 나중에 하루에 2011-01-31에 값을 가질 수있다.
제안 : 변경 그것은 날짜 시간 유형 인 경우 날짜 형식으로 필드.
-
==============================
6.이 쿼리는 나를 위해 작동 안녕
이 쿼리는 나를 위해 작동 안녕
select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
-
==============================
7.
select * from person where DATE(dob) between '2011-01-01' and '2011-01-31'
놀랍게도 이러한 전환은 MySQL의 많은 문제에 대한 해결책입니다.
-
==============================
8.귀하의 경우 그래서, 일 + 1 일 상단 날짜를 설정, 2011-02-01로 설정합니다.
귀하의 경우 그래서, 일 + 1 일 상단 날짜를 설정, 2011-02-01로 설정합니다.
-
==============================
9.당신은 쿼리로 실행할 수 있습니다 :
당신은 쿼리로 실행할 수 있습니다 :
select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
날짜가 하드 코딩하는 경우 다른 사람과 같이 지적했다.
한편, 같은 날 다른 테이블에있는 경우, 당신은 하루에 추가 할 수 있습니다 (날짜가 두 번째 / 시간없이 저장하는 경우) 두 번째를 빼기 :
select * from person JOIN some_table ... where dob between some_table.initial_date and (some_table.final_date + INTERVAL 1 DAY - INTERVAL 1 SECOND)
그 (있는 가정의 DOB 필드에 인덱스를 사용할 수없는 같은) 거대한 성능 문제가 발생할 수 있기 때문에, (허용 대답에 같은) DOB의 fiels에 캐스트를 수행하지 마십시오. 실행 계획은 DATE (DOB) 또는 (DATE AS DOB) CAST 같은 것을 할 경우, 너무 조심 어디에 사용하여 인덱스 조건을 사용하여 변경 될 수 있습니다!
-
==============================
10.당신은 '2011-01-01'과 '2011-01-31'사이에 들어 가려고 줄 그러므로 때 MySQL의에서 값 사이이 포함됩니다
당신은 '2011-01-01'과 '2011-01-31'사이에 들어 가려고 줄 그러므로 때 MySQL의에서 값 사이이 포함됩니다
그것은 2011-01-31 0시 0분 0초 개까지 2011-01-01 0시 0분 0초에서 포함됩니다 그러므로 아무것도 실제로 2011-01-31에서의 시간은 2011-01-31 0시 0분 0초 ~ 2011-01-31 23시 59분 59초에서 갈해야하기 때문에
당신은 2011-02-01에 변경할 수있는 상한을 위해 그것은 2011-01-31 23시 59분 59초 개까지의 모든 데이터를 얻을 것이다
from https://stackoverflow.com/questions/5080824/mysql-between-clause-not-inclusive by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] CTE에서 테이블의 업데이트 기록 (0) | 2020.04.07 |
---|---|
[SQL] 오라클 사용하여 대량 삽입 .NET (0) | 2020.04.06 |
[SQL] 가입과 방법을 찾을 수 CakePHP의 (0) | 2020.04.06 |
[SQL] 어떻게 SQL Server에서 문자열의 각 단어의 첫 글자를 대문자로 할 수있는 가장 좋은 방법 (0) | 2020.04.06 |
[SQL] 어떻게 COUNT 집계에서 "제로"/ "0"을 포함하는? (0) | 2020.04.06 |