Programing

날짜 시간 열에서 날짜를 선택하는 방법은 무엇입니까?

lottogame 2020. 4. 27. 07:57
반응형

날짜 시간 열에서 날짜를 선택하는 방법은 무엇입니까?


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 구문을 지정해야합니다 (마이크로 초 트랜잭션, 질문이있을 때 MySQL이 2009 년에 지원하지 않았다고 생각합니다).

timestamp특정 날짜에 대해 MySQL 필드 를 쿼리하는 올바른 방법 은 원하는 날짜에 대해 Greater-Than-Equals를 확인하고 지정된 시간없이 그 다음 날에 Less-Than을 확인하는 것입니다.

WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'

이 방법은 성능이 가장 빠르고 메모리가 가장 적고 리소스가 가장 적은 방법이며 초 단위 시간 소인 정밀도와 같은 모든 MySQL 기능과 코너 케이스를 추가로 지원합니다. 또한 미래의 증거입니다.


모든 형식은 다음과 같습니다

이것이 datetimetable 값 을 포함하는 열이라고 가정 하십시오 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))

날짜 함수를 사용하는 간단하고 가장 좋은 방법

example

SELECT * FROM 
data 
WHERE date(datetime) = '2009-10-20' 

OR

SELECT * FROM 
data 
WHERE date(datetime ) >=   '2009-10-20'  && date(datetime )  <= '2009-10-20'

Well, using LIKE in statement is the best option WHERE datetime LIKE '2009-10-20%' it should work in this case

참고URL : https://stackoverflow.com/questions/1754411/how-to-select-date-from-datetime-column

반응형