복붙노트

[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. ==============================

    1.필드 DOB 아마 시간 구성 요소를 가지고있다.

    필드 DOB 아마 시간 구성 요소를 가지고있다.

    그것을 잘라하려면 :

    select * from person 
    where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'
    
  2. ==============================

    2.MySQL의-매뉴얼에서 :

    MySQL의-매뉴얼에서 :

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

    3.문제는 2011-01-31 정말 2011-01-31 00:00:00 점이다. 즉, 하루의 시작입니다. 낮에는 모든 것이 포함되어 있지 않습니다.

    문제는 2011-01-31 정말 2011-01-31 00:00:00 점이다. 즉, 하루의 시작입니다. 낮에는 모든 것이 포함되어 있지 않습니다.

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

    4.

    select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'
    
  5. ==============================

    5.당신은 당신의 쿼리에서 날짜 형 또는 날짜 시간 유형을 현장 참조하고 있습니까?

    당신은 당신의 쿼리에서 날짜 형 또는 날짜 시간 유형을 현장 참조하고 있습니까?

    당신이 정말 날짜 형식을 사용되어야 날짜 시간 유형을 사용할 때이 설명하는 행동의 일반적인 원인이다. 당신이 정말로 시간 사람이 태어난 알 필요가없는 즉, 그냥 날짜 형식을 사용합니다.

    마지막 날이 결과에 포함되지 않는 이유는 쿼리는 쿼리에 지정하지 않았다 날짜의 시간 부분을 가정하고있는 방법입니다.

    즉 : 귀하의 질의는 2011-01-30와 2011-01-31 사이 자정까지로 해석되고 있지만, 데이터는 언젠가 나중에 하루에 2011-01-31에 값을 가질 수있다.

    제안 : 변경 그것은 날짜 시간 유형 인 경우 날짜 형식으로 필드.

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

    6.이 쿼리는 나를 위해 작동 안녕

    이 쿼리는 나를 위해 작동 안녕

    select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
    
  7. ==============================

    7.

    select * from person where DATE(dob) between '2011-01-01' and '2011-01-31'
    

    놀랍게도 이러한 전환은 MySQL의 많은 문제에 대한 해결책입니다.

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

    8.귀하의 경우 그래서, 일 + 1 일 상단 날짜를 설정, 2011-02-01로 설정합니다.

    귀하의 경우 그래서, 일 + 1 일 상단 날짜를 설정, 2011-02-01로 설정합니다.

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

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

    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초 개까지의 모든 데이터를 얻을 것이다

  11. from https://stackoverflow.com/questions/5080824/mysql-between-clause-not-inclusive by cc-by-sa and MIT license