Mysql 형변화 질문, 아주 기초 질문입니다. 조언 부탁드려요! 0 3 537

by 이유택 [MySQL] [2021.08.04 00:19:31]


안녕하세요 반갑습니다.

미리 감사드립니다! 아래 형변환 질문 한번 검토 부탁드립니다.

 

날짜 데이터가 들어가는 컬럼에 정보의 성격이 TIMESTAMP 가정 >> 컬럼명  mdate

저는 보통 오라클에서 작업을 해서, 아래와 같이 그냥 to_char로 바꿔서 기간을 잡고 조회를 합니다.

 

mysql은 형변환이  CAST와 CONVERT 두개인데 기능은 같고, 사용 방식만 다른것으로 알고있습니다.

아래와같이 convert로 date형으로 변경해서, between '2021-08-01' and '2021-08-10'로 결과값은 만들었는데

timestamp 날짜 시간 컬럼을 더 편하게 기간을 조회할 방법은 어떻게 할 수 있나요?

 

예시)

 - 21년 8월 1~10일까지 데이터를 추출

[ORACLE] 

Select  *

 from test_tb

where   to_char(mdate, 'yyyymmdd') between '20210801' and '20210810';

 

[Mysql] - 21년 8월 1~10일까지 데이터를 추출 >> 더 간단히 형변환하여 날짜 기간을 조회하고 싶습니다.

select convert(mdate, date)

  from test_tb

 where convert(mdate, date) between '2021-08-01' and '2021-08-10';

 

by pajama [2021.08.04 09:26:25]

mariadb이긴 합니다만..date나 timestamp라면 형변환 없이도 되는 것 같네요.

MariaDB [test]> create table t1 (a timestamp);
Query OK, 0 rows affected (0.005 sec)

MariaDB [test]> insert into t1 values ('2021-08-04');
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> insert into t1 values ('2021-08-03');
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> insert into t1 values ('2021-08-02');
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> select * from t1 where a >='2021-08-04';
+---------------------+
| a                   |
+---------------------+
| 2021-08-04 00:00:00 |
+---------------------+
1 row in set (0.001 sec)

MariaDB [test]> create table t2 (a date);
Query OK, 0 rows affected (0.004 sec)

MariaDB [test]> insert into t2 values ('2021-08-02');
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> insert into t2 values ('2021-08-03');
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> select * from t2 where a >='2021-08-04';
Empty set (0.000 sec)

MariaDB [test]> select * from t2 where a >='2021-08-02';
+------------+
| a          |
+------------+
| 2021-08-02 |
| 2021-08-03 |
+------------+
2 rows in set (0.001 sec)

 


by 마농 [2021.08.04 09:58:13]

기존 오라클 방식도 마찬가지지만
컬럼을 변형하여 조건에 맞추는 방식은 좋지 않습니다.
컬럼은 그대로 둔 채 조건을 컬럼에 맞게 가공하여 비교하는게 좋습니다.
 

SELECT *
  FROM test_tb 
 WHERE mdate >= '2021-08-01'
   AND mdate <  '2021-08-10' + INTERVAL 1 DAY
;

 


by 축구쟁이 [2021.08.04 10:02:51]

where 절의 대상 컬럼을 가공( where convert(mdate, date) between '2021-08-01' and '2021-08-10'; )하거나 우선순위에 의해 묵시적 형변환이 발생할 경우 인덱스를 사용할 수 없는 점이 있으므로 주의가 필요합니다.

pajama님 답변처럼 timestamp 타입에 대해 자동 형변환이 되는 데이터 포맷으로 검색되도록 하면 명시적으로 형변환을 하지 않아도 됩니다.

이때 문자열은 timestamp보다 우선순위가 낮기 때문에 묵시적 형변환이 발생해도 정상적으로 인덱스 사용이 가능합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입