2009-10-20 10:00:00과 같은 값을 가진 “datetime”유형의 열이 있습니다.
datetime에서 날짜를 추출하고 다음과 같은 쿼리를 작성하고 싶습니다.
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
다음이 가장 좋은 방법입니까?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
그러나 이것은 빈 결과 집합을 반환합니다. 어떤 제안?
답변
MySQL의 DATE()
기능을 사용할 수 있습니다 :
WHERE DATE(datetime) = '2009-10-20'
당신은 또한 이것을 시도 할 수 있습니다 :
WHERE datetime LIKE '2009-10-20%'
의 성능 영향에 대한 정보는 이 답변 을 참조하십시오 LIKE
.
답변
사용 WHERE DATE(datetime) = '2009-10-20'
에 성능 문제가 있습니다 . 여기에 명시된 바와 같이 :
DATE()
일치하지 않는 행을 포함하여 모든 행에 대해 계산 합니다.- 쿼리에 인덱스를 사용하는 것은 불가능합니다.
사용 BETWEEN
하거나 >
, <
, =
인덱스를 사용할 수 있도록 운영자 :
SELECT * FROM data
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'
업데이트 : 인덱싱 된 열에서 연산자 대신 사용에 대한 영향 이 높습니다 . 다음은 1,176,000 개의 행이있는 테이블에 대한 테스트 결과입니다.LIKE
- 사용
datetime LIKE '2009-10-20%'
=> 2931ms - 사용
datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168ms
동일한 쿼리에 대해 두 번째 호출을 수행하면 차이가 훨씬 높아집니다. 2984ms 대 7ms (예, 7 밀리 초) Hibernate를 사용하여 프로젝트에서 오래된 코드를 다시 쓰는 동안 이것을 발견했습니다.
답변
날짜 시간을 YMD 부분으로 형식화 할 수 있습니다.
DATE_FORMAT(datetime, '%Y-%m-%d')
답변
페이지의 모든 답변이 원하는 결과를 반환하지만 모두 성능 문제가 있습니다. 절의 필드에서 계산을 수행하지 마십시오 WHERE
(DATE()
테이블의 모든 행에서 계산을 수행해야하므로 계산 .
이 BETWEEN ... AND
구문은 두 국경 조건에 모두 포함되며 다른 날짜가있는 종료 날짜에 23:59:59 구문을 지정해야합니다 (마이크로 초 트랜잭션, 질문은 2009 년에 MySQL이 지원하지 않았다고 생각합니다).
timestamp
특정 날짜에 대해 MySQL 필드 를 쿼리하는 올바른 방법 은 원하는 날짜에 대해 Greater-Than-Equals를 확인하고 시간을 지정하지 않고 그 다음 날에 Less-Than을 확인하는 것입니다.
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
이 방법은 성능이 가장 빠르고 메모리가 가장 적고 리소스가 가장 적은 방법이며 초 단위 시간 소인 정밀도와 같은 모든 MySQL 기능 및 코너 케이스를 추가로 지원합니다. 또한 미래의 증거입니다.
답변
모든 형식은 다음과 같습니다
이것이 datetime
table 값 을 포함하는 열이라고 가정 하십시오 data
.
+--------------------+
| date_created |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+
mysql> select DATE(date_created) from data;
+--------------------+
| DATE(date_created) |
+--------------------+
| 2018-06-02 |
+--------------------+
mysql> select YEAR(date_created) from data;
+--------------------+
| YEAR(date_created) |
+--------------------+
| 2018 |
+--------------------+
mysql> select MONTH(date_created) from data;
+---------------------+
| MONTH(date_created) |
+---------------------+
| 6 |
+---------------------+
mysql> select DAY(date_created) from data;
+-------------------+
| DAY(date_created) |
+-------------------+
| 2 |
+-------------------+
mysql> select HOUR(date_created) from data;
+--------------------+
| HOUR(date_created) |
+--------------------+
| 15 |
+--------------------+
mysql> select MINUTE(date_created) from data;
+----------------------+
| MINUTE(date_created) |
+----------------------+
| 50 |
+----------------------+
mysql> select SECOND(date_created) from data;
+----------------------+
| SECOND(date_created) |
+----------------------+
| 31 |
+----------------------+
답변
당신이 사용할 수있는:
DATEDIFF ( day , startdate , enddate ) = 0
또는:
DATEPART( day, startdate ) = DATEPART(day, enddate)
AND
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)
또는:
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))
답변
날짜 함수를 사용하는 간단하고 가장 좋은 방법
예
SELECT * FROM
data
WHERE date(datetime) = '2009-10-20'
또는
SELECT * FROM
data
WHERE date(datetime ) >= '2009-10-20' && date(datetime ) <= '2009-10-20'