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')
여기서 괄호는 선택 사항이지만 더 복잡한 쿼리에서 중요할 수 있습니다.
다음 두 가지 옵션 중 하나를 수행해야 합니다.
- 시간 구성 요소 포함
between
상태:... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'
(권장하지 않음...마지막 단락 참조) - 대신 부등식을 사용합니다.
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_at
22 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
'prosource' 카테고리의 다른 글
PowerShell을 사용한 재귀 파일 검색 (0) | 2023.04.08 |
---|---|
powershell의 & 기호는 무엇을 의미합니까? (0) | 2023.04.08 |
SQL의 여러 열 업데이트 (0) | 2023.04.08 |
SQL WHERE...IN 절 다중 열 (0) | 2023.04.08 |
Powershell - Invoke-WebRequest 사용이 브라우저 다운로드보다 느린 이유는 무엇입니까? (0) | 2023.04.08 |