날짜 / 시간 범위에서 데이터 선택


83

MySQL에서 날짜 범위 사이의 데이터를 어떻게 선택합니까? 내 datetime열은 24 시간 줄 루어 시간 형식입니다.

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

이 기간 사이에 데이터가 있어도 아무것도 반환하지 않습니다. 'from''to' 필드 의 값을 강제로 datetime쿼리 에 입력해야합니까?


의 데이터 유형은 game_date무엇입니까?
hjpotter92

1
그것의 datetime. 왜 혼란 스러웠는지 알아 낸 것 같아요. mysql에 두꺼비 소프트웨어 를 사용 하고 있으며 기본적으로 날짜 범위에서 사용한 형식으로 날짜를 렌더링하므로 동일한 것을 사용했습니다. 그래서 문제는 내가 제공 한 날짜의 형식이었습니다.
codingknob apr.

Eugen Rieck에서 제공하는 형식을 사용하면 예상대로 작동합니다.
codingknob apr.

답변:


144

날짜 형식을 업데이트해야합니다.

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;

2
어느 날짜가 날짜이고 어느 달이 여기에 있습니까?
Arun

8
날짜 리터럴의 형식은 'YYYY-MM-DD HH : mm : SS'입니다.
Eugen Rieck

13
특히 MySQL이 이제 1 초 미만의 시간 정밀도를 지원하기 때문에 BETWEEN을 사용하는 것은 모범 사례가 아닙니다 . 23:59:59를 사용하면 하루가 끝나는 데 1 초가 부족합니다. where game_date >= '2012-03-11' and game_date < '2012-05-12'날짜 범위를 정의하는 가장 정확한 방법이며 날짜부터 초 미만 단위까지 모든 수준의 시간 정밀도에서 작동합니다.
Used_By_Already

3
@Used_By_Already 2013 년에 이것이 답변되었을 때 1 초 미만의 MySQL이 없었습니다. 23:59에서 00:00 사이에 시작하는 하키 게임에 대해 아직 듣지 못했습니다.
Eugen Rieck

5
이 주석을 남긴 것은 1 초 미만의 정밀도로 MySQL 버전을 사용하는 독자를위한 것입니다. MySQL 버전 5.6.4 이상은 분수 초를 지원합니다. (날짜 범위가 어떤 스포츠 또는 목적인지에 관한 것입니다.)
Used_By_Already

19

다음은 날짜 함수를 사용하는 간단한 방법입니다.

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc

7
내가 눈이 멀었나요 아니면 이건 성능 킬러인가요? 필드가 아닌 계산 된 값date(game_date) 에 대해 비교가 실행됩니다. 결과적으로 인덱스가 사용되지 않고 모든 단일 행이 터치됩니다 (예 : 전체 테이블 스캔)!
Eugen Rieck 2013

1
@EugenRieck. . . 에 색인이 있다고 가정하면 일반적으로 옳습니다 game_date. 인덱스가 없어도 성능이 눈에 띄게 차이가 나도록 테이블 크기를 적당히 조정해야합니다. 이름에 대한 무언가 hockey_stats가 이것이 정말로 큰 테이블이 아니라는 것을 암시합니다.
Gordon Linoff 2013-04-04

8

간단한 방법 :

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'

5

STR_TO_DATE 함수 를 사용해야 할 것입니다 .

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(game_date가 문자열 인 경우 STR_TO_DATE를 사용해야 할 수 있습니다.)


4

MySQL 날짜 형식은 YMD입니다. Y / M / D를 사용하고 있습니다. 그것은 잘못된 것입니다. 쿼리를 수정하십시오.

Y / M / D와 같이 날짜를 입력하면 데이터베이스에 null 값이 삽입됩니다.

PHP를 사용하고 있고 양식에서 얻은 날짜가 Y / M / D와 같으면 문을 사용하여이를 대체 할 수 있습니다.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))

4

간단한 방법으로 다음과 같이 쿼리 할 수 ​​있습니다.

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

이것은 시간이 문제가되지 않는다면 작동합니다.

시간을 고려하면 다음과 같은 방식으로 따릅니다.

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

이것은 MySQL 서버용입니다.


2

당신도 사용자 수 STR_TO_DATE의 당신이 게시 한 형식에 따라 자신의 날짜 매개 변수를 기능을 전달합니다

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

또는 MySQL이 날짜 YYYY : MM : DD HH : mm : SS를 처리하는 형식을 사용하고 쿼리를 다음과 같이 사용하십시오.

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;


2

데이터베이스에 game_date 데이터를 삽입하는 방법에 대해 date defend를 검색해야합니다. 예를 들어 긴 날짜 또는 짧은 날짜 값을 삽입 한 경우.

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

BETWEEN 을 사용할 수도 있습니다 .

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

그렇게 간단합니다.


나는 똑같이 시도하고 있지만 제대로 작동하지 않고 임의의 날짜 별 데이터를 얻습니다.
Manjeet Kumar Nai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.