[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.그것은 포함입니다. 당신은 날짜에 날짜 시간을 비교한다. 하루를 시작할 때 두 번째 날짜는 자정으로 해석됩니다.
그것은 포함입니다. 당신은 날짜에 날짜 시간을 비교한다. 하루를 시작할 때 두 번째 날짜는 자정으로 해석됩니다.
이 문제를 해결하는 한 가지 방법은 다음과 같습니다
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.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.이러한 두 가지 옵션 중 하나를 수행해야합니다 :
이러한 두 가지 옵션 중 하나를 수행해야합니다 :
내 개인적인 취향은 두 번째 옵션이다. 또한, 아론 버트 랜드는 사용해야하는 이유에 아주 명확한 설명이있다.
-
==============================
4.그냥 날짜와 시간 스탬프를 사용합니다 :
그냥 날짜와 시간 스탬프를 사용합니다 :
SELECT * FROM Cases WHERE date(created_at)='2013-05-01'
-
==============================
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.
cast(created_at as date)
즉 SQL 서버의 2008 및 최신 버전을 작동합니다
당신이 이전 버전을 사용하는 경우 사용
convert(varchar, created_at, 101)
-
==============================
7.당신은 날짜에서 날짜를 추출하고 당신에게 포괄적 날짜와 같은 결과를 줄 것이다 날짜 () 함수를 사용할 수 있습니다 :
당신은 날짜에서 날짜를 추출하고 당신에게 포괄적 날짜와 같은 결과를 줄 것이다 날짜 () 함수를 사용할 수 있습니다 :
SELECT * FROM Cases WHERE date(created_at)='2013-05-01' AND '2013-05-01'
-
==============================
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]);
from https://stackoverflow.com/questions/16347649/sql-between-not-inclusive by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 컨트롤러 CakePHP의 SQL 덤프를 볼 수 있습니까? (0) | 2020.05.18 |
---|---|
[SQL] PostgreSQL은 - 열에 대해 최대 값을 갖는 행을 페치 (0) | 2020.05.18 |
[SQL] 나는 SQL Server 2005의 일부 레코드를 업데이트 CASE 문을 사용하려면 (0) | 2020.05.18 |
[SQL] 64 기수 문자열로 저장 UUID (0) | 2020.05.18 |
[SQL] 테이블을 잠그지 않고 ALTER 표? (0) | 2020.05.18 |