prosource

SQL "between" (사이에 포함되지 않음)

probook 2023. 4. 8. 08:39
반응형

SQL "between" (사이에 포함되지 않음)

다음과 같은 질문이 있습니다.

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

하지만 1일에 데이터가 있는데도 아무런 성과가 없습니다.

created_at처럼 보인다2013-05-01 22:25:19시간과 관련이 있는 것 같은데?이 문제를 어떻게 해결할 수 있을까요?

날짜 범위를 넓히면 문제없지만, 단일 날짜로도 사용할 수 있습니다.

포함입니다.날짜와 날짜를 비교하고 있습니다.두 번째 날짜는 하루가 시작되는 자정으로 해석됩니다.

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

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'

Aaron Bertrand는 블로그에 긴 날짜(여기)를 게재하고 있습니다.이 블로그에서는, 이것과 그 외의 날짜의 문제에 대해 설명합니다.

두 번째 날짜 참조는 다음과 같습니다.BETWEEN구문은 마법처럼 "오늘의 끝"으로 간주되지만 이는 사실이 아닙니다.

즉, 이는 예상되었다.

케이스에서 선택 *'2013-05-01' 시작과 '2013-05-01' 종료 사이생성된 위치

하지만 실제로 일어나는 일은 다음과 같습니다.

케이스에서 선택 *'2013-05-01 00:00:00+00000'과 '2013-05-01 00:00:00+00000' 사이에 생성된 위치

즉, 다음과 같습니다.

선택 * FROM WHERE created_at = '2013-05-01 00:00:00+00000'

이 문제는 에 대한 인식/예상 중 하나입니다.BETWEEN은 하한값과 상한값을 모두 포함하지만 마법처럼 날짜를 "시작" 또는 "끝"으로 만들지는 않습니다.

BETWEEN날짜 범위로 필터링할 때는 피해야 합니다.

항상 사용>= AND <대신

케이스에서 선택 *WHERE(created_at >= '20130501'  created_at < '20130502')

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

다음 두 가지 옵션 중 하나를 수행해야 합니다.

  1. 시간 구성 요소 포함between상태:... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'(권장하지 않음...마지막 단락 참조)
  2. 대신 부등식을 사용합니다.between. 두 번째 값에 하루를 추가해야 합니다.... where (created_at >= '2013-05-01' and created_at < '2013-05-02')

제 개인적인 취향은 두 번째 선택사항입니다.또한, Aaron Bertrand는 왜 그것이 사용되어야 하는지에 대해 매우 명확한 설명을 했습니다.

타임스탬프를 날짜로 사용합니다.

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

날짜 필드와 날짜 필드를 비교하는 가장 좋은 해결책은 다음과 같습니다.

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 

이는 시작일과 종료일뿐만 아니라 그 사이에 해당하는 날짜도 포함하기 때문에 포함 간 문장에 해당합니다.

cast(created_at as date)

2008년 이후 버전의 SQL Server에서만 사용할 수 있습니다.

이전 버전을 사용하는 경우

convert(varchar, created_at, 101)

.date()날짜/시간에서 날짜를 추출하여 결과를 포함 날짜로 제공하는 함수:

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

당신의 코드

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

SQL이 읽는 방법

SELECT * FROM Cases WHERE '2013-05-01 22:25:19' BETWEEN '2013-05-01 00:00:00' AND '2013-05-01 00:00:00'

를 비교할 때 과 date:만, 시각을 , Date Time은 .초가 0이 됩니다.이 경우 날짜는 같지만 시간을 비교하면 마찬가지입니다.created_at22 hours보다

등 여러 으로 이 합니다.BETWEEN '2013-05-01' AND ''2013-05-01 23:59:59''

또는

하면 create_at가 나옵니다.cast(created_at as date)로 한 후'2013-05-01 22:25:19' 되다'2013-05-01 00:00:00'

Aaron Bertrand의 제안대로 포괄적이긴 하지만 (자세한 내용은 여기를 참조하십시오.

날짜/시간 범위에 BETWEN을 사용하지 마십시오.

이 근처에 있는 다른 좋은 답변 외에도 다음과 같이 (날짜에 날짜를 추가하는 데) 사용할 수 있습니다.

SELECT * FROM Cases WHERE created_at >= '2013-05-01' AND created_at < DATEADD(day, 1, '2013-05-01')

Dyamic 날짜 BETWEEN 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]);

언급URL : https://stackoverflow.com/questions/16347649/sql-between-not-inclusive

반응형