다음과 같은 쿼리가 있습니다.
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는 날짜 ( here ) 에 긴 블로그 항목을 가지고 있으며 여기 에서 기타 날짜 문제에 대해 설명합니다.
답변
BETWEEN
구문 에서 두 번째 날짜 참조 는 마술처럼 “날의 끝”으로 간주되지만 이는 사실이 아닙니다 .
즉, 이것은 예상되었다 :
사례 선택 * WHERE BETWEEN created_at 의 시작 '2013년 5월 1일'AND 의 끝 '2013년 5월 1일'
그러나 실제로 일어나는 일은 다음과 같습니다.
사례 선택 * '2013-05-01 00 : 00 : 00 + 00000 '과 '2013-05-01 00 : 00 : 00 + 00000 ' 사이에 created_at이 (가) 있습니다
다음과 같습니다.
SELECT * FROM Cases where WHERE created_at = '2013-05-01 00 : 00 : 00 + 00000 '
문제에 대한 인식 / 기대 중 하나입니다 BETWEEN
어느 않습니다 낮은 값과 범위의 상단 값을 모두 포함하지만, 하지 않는 마술 날짜가 또는 “말” “의 시작”합니다.
BETWEEN
날짜 범위별로 필터링 할 때는 사용하지 않아야합니다.
항상>= AND <
대신 사용하십시오
사례 선택 * 어디에 (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'