MySQL을 사용하여 두 날짜 사이에 어떻게 쿼리합니까?


225

다음 쿼리 :

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

아무것도 반환하지 않습니다.

그래도 쿼리가 작동하기에 충분한 데이터가 있어야합니다. 내가 뭘 잘못하고 있죠?


32
모두 같은 BETWEEN으로 신중 min하고 max값 범위로 간주 중 하나 인 두 날짜 처리하지, minmax값 (에지 케이스). 예를 들어, 날짜는 2010-09-29 00:00:00사이 2010-09-28 00:00:002010-09-29 00:00:00 , 또한 사이 2010-09-29 00:00:002010-09-30 00:00:00
minipif

답변:


471

두 번째 날짜는 첫 날짜 이전입니다 (예 : 2010 년 9 월 29 일과 2010 년 1 월 30 일 사이에 쿼리 함). 날짜 순서를 반대로 해보십시오.

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

나는 이것을 알고 있었지만 이제는 업데이트에 문제가 있습니다. 업데이트에 BETWEEN을 사용하려고하면 같은 방식으로 작동합니까?
Ingus

3
@IngusGraholskis : where절은 on select또는 updatestatement 와 동일하게 작동해야 합니다.
T30

개인적으로, 나는 '부터'와 '에서'라는 용어가 쿼리 작성 순서를 기억하는 비열한 방법을 찾습니다.
KeaganFouche

두 날짜가 모두 비어 있거나 비어있는 경우 모든 데이터를 반환하는 방법은 무엇입니까?
코딩 세계

23

검색어 날짜는

select * from table between `lowerdate` and `upperdate`

시험

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

20

인가 date_fielddatetime? 또한 초기 날짜를 먼저 입력해야합니다.

그것은해야한다:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

17

DATE ()는 날짜 또는 날짜 / 시간 표현식의 날짜 부분 만 추출하는 MySQL 함수입니다.

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

사람들이 당신이하는 일을 이해할 수 있도록 설명을 추가 할 있습니다.
Franz Gleichmann

6

@sabin의 답변에 대한 확장 기능과 날짜 부분 만 시간 을 비교하려는 경우 힌트 :

비교할 필드가 datetime 유형의 것이고 날짜 만 비교를 위해 지정된 경우,이 날짜 는 내부적으로 날짜 / 시간 값으로 변환 됩니다. 이것은 다음 쿼리가

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

로 변환됩니다

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

내부적으로.

결과적으로 시간이 00:00:00보다 큰 2010-09-29의 개체가 포함되지 않은 결과가 발생합니다!

따라서 날짜가 2010-09-29 인 모든 개체도 포함해야하는 경우 비교할 필드를 날짜로 변환해야합니다.

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')

4

크거나 같거나 작거나 같게 비교하여 수동으로 수행 할 수 있습니다.

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

이 예에서는 특정 날마다 데이터를 검색해야합니다. 우리는 하루의 시작부터 다른 날의 최신 초까지 비교할 것입니다.

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';

1

서버 측 또는 클라이언트 측의 날짜 구성에 문제가있을 수 있습니다. 호스트가 스페인어, 프랑스어 또는 기타 형식으로 구성된 경우 여러 데이터베이스에서 공통적 인 문제인 것으로 나타났습니다. dd / mm / yyyy 또는 mm / dd / yyyy 형식에 영향을 줄 수 있습니다.


3
문제는 이전 날짜가 최신 날짜보다 이전에 나열되었다는 것입니다.
theninjagreggreg

1

date_field를 날짜로 캐스트하십시오.

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

날짜 시간 값을 사용할 때는 필드를로 변환 DateTime하지 말아야 Date합니다. 시도 :

SELECT * FROM `objects` 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.