복붙노트

[SQL] 포함하지 "사이의"SQL

SQL

포함하지 "사이의"SQL

나는이 같은 쿼리가 :

SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'

그러나 이것은 1에 데이터가 비록 어떤 결과를 제공하지 않습니다.

2013년 5월 1일 22시 25분 19초 같은 created_at 외모, 나는 그것이 시간과 관련이있다 의심? 이것은 어떻게 해결할 수 있을까?

나는 큰 날짜 범위를한다면 그것은 잘 작동하지만, 너무 한 날짜가해야 (포함) 작동합니다.

해결법

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

    1.그것은 포함입니다. 당신은 날짜에 날짜 시간을 비교한다. 하루를 시작할 때 두 번째 날짜는 자정으로 해석됩니다.

    그것은 포함입니다. 당신은 날짜에 날짜 시간을 비교한다. 하루를 시작할 때 두 번째 날짜는 자정으로 해석됩니다.

    이 문제를 해결하는 한 가지 방법은 다음과 같습니다

    SELECT *
    FROM Cases
    WHERE cast(created_at as date) BETWEEN '2013-05-01' AND '2013-05-01'
    

    그것을 해결하는 또 다른 방법은 명시 적 이진 비교 함께

    SELECT *
    FROM Cases
    WHERE created_at >= '2013-05-01' AND created_at < '2013-05-02'
    

    아론 버트 랜드는 그가 이것과 다른 날짜 문제에 대해 설명합니다 (여기) 날짜에 긴 블로그 항목을 가지고 있습니다.

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

    2.BETWEEN 구문 제 날짜 지령 마술 "오늘의 끝"으로 간주하지만이 사실 인 것으로 가정되었다.

    BETWEEN 구문 제 날짜 지령 마술 "오늘의 끝"으로 간주하지만이 사실 인 것으로 가정되었다.

    즉이 예상되었다 :

    SELECT * FROM Cases 
    WHERE created_at BETWEEN the beginning of '2013-05-01' AND the end of '2013-05-01'

    하지만 정말 일어날 것은 이것이다 :

    SELECT * FROM Cases 
    WHERE created_at BETWEEN '2013-05-01 00:00:00+00000' AND '2013-05-01 00:00:00+00000'
    

    어떤에 해당된다 :

    SELECT * FROM Cases WHERE created_at = '2013-05-01 00:00:00+00000'
    

    문제는 낮은 값과 범위의 상단 값을 모두 포함 않는 BETWEEN에 대한 인식 / 기대의 하나이지만, 마술 날짜가 또는 "말" "의 시작"하지 않습니다.

    날짜 범위에 의해 필터링 할 때 BETWEEN 피해야한다.

    항상 대신 <를 사용> = AND

    SELECT * FROM Cases 
    WHERE (created_at >= '20130501' AND created_at < '20130502')

    괄호는 여기에 선택 사항이지만 더 복잡한 쿼리에 중요 할 수있다.

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

    3.이러한 두 가지 옵션 중 하나를 수행해야합니다 :

    이러한 두 가지 옵션 중 하나를 수행해야합니다 :

    내 개인적인 취향은 두 번째 옵션이다. 또한, 아론 버트 랜드는 사용해야하는 이유에 아주 명확한 설명이있다.

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

    4.그냥 날짜와 시간 스탬프를 사용합니다 :

    그냥 날짜와 시간 스탬프를 사용합니다 :

    SELECT * FROM Cases WHERE date(created_at)='2013-05-01' 
    
  5. ==============================

    5.나는 날짜 필드에 날짜 필드를 비교하는 가장 좋은 방법은 다음과 같은 것을 발견 :

    나는 날짜 필드에 날짜 필드를 비교하는 가장 좋은 방법은 다음과 같은 것을 발견 :

    DECLARE @StartDate DATE = '5/1/2013', 
            @EndDate   DATE = '5/1/2013' 
    
    SELECT * 
    FROM   cases 
    WHERE  Datediff(day, created_at, @StartDate) <= 0 
           AND Datediff(day, created_at, @EndDate) >= 0 
    

    그것은 잘 사이에 떨어지는 것과 같은 같은 시작과 종료 날짜를 모두 포함 이것은 문 사이의 포함에 해당합니다.

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

    6.

    cast(created_at as date)
    

    즉 SQL 서버의 2008 및 최신 버전을 작동합니다

    당신이 이전 버전을 사용하는 경우 사용

    convert(varchar, created_at, 101)
    
  7. ==============================

    7.당신은 날짜에서 날짜를 추출하고 당신에게 포괄적 날짜와 같은 결과를 줄 것이다 날짜 () 함수를 사용할 수 있습니다 :

    당신은 날짜에서 날짜를 추출하고 당신에게 포괄적 날짜와 같은 결과를 줄 것이다 날짜 () 함수를 사용할 수 있습니다 :

    SELECT * FROM Cases WHERE date(created_at)='2013-05-01' AND '2013-05-01'
    
  8. ==============================

    8.SQL 쿼리 간의 동적 날짜

    SQL 쿼리 간의 동적 날짜

    var startDate = '2019-08-22';
    var Enddate = '2019-10-22'
         let sql = "SELECT * FROM Cases WHERE created_at BETWEEN '?' AND '?'";
         const users = await mysql.query( sql, [startDate, Enddate]);
    
  9. from https://stackoverflow.com/questions/16347649/sql-between-not-inclusive by cc-by-sa and MIT license