날짜가 '10/12/2010'처럼 문자열로 저장된 경우, 특정 연도에 해당하는 레코드만 골라서 업데이트하려면 STR_TO_DATE() 함수와 YEAR() 함수를 함께 사용하면 됩니다.
먼저 전체 구문은 다음과 같습니다.
update yourTableName set yourColumnName1=yourValue1 where YEAR(str_to_date(yourColumnName2,'%d/%m/%Y'))=yourValue2;
여기서 STR_TO_DATE()는 '%d/%m/%Y' 형식(일/월/년)으로 저장된 문자열을 실제 DATE 값으로 변환하고, YEAR()는 변환된 날짜에서 연도 부분만 추출하여 WHERE 조건과 비교합니다.
예제 테이블 생성
먼저 테스트용 테이블을 만들어 보겠습니다.
mysql> create table DemoTable1924
(
UserName varchar(20),
UserJoiningDate varchar(40)
);
Query OK, 0 rows affected (0.00 sec)insert 명령을 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1924 values('Chris','10/12/2010');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1924 values('David','20/01/2011');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1924 values('Mike','20/01/2010');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1924 values('Carol','26/04/2013');
Query OK, 1 row affected (0.00 sec)전체 데이터 확인
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1924;
실행 결과는 다음과 같습니다.
+----------+-----------------+ | UserName | UserJoiningDate | +----------+-----------------+ | Chris | 10/12/2010 | | David | 20/01/2011 | | Mike | 20/01/2010 | | Carol | 26/04/2013 | +----------+-----------------+ 4 rows in set (0.00 sec)
특정 연도 기준으로 레코드 업데이트
이제 입사 연도가 2010년인 레코드의 UserName을 'Robert'로 변경하는 쿼리를 실행해 보겠습니다.
mysql> update DemoTable1924 set UserName='Robert' where YEAR(str_to_date(UserJoiningDate,'%d/%m/%Y'))=2010; Query OK, 2 rows affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0
쿼리 실행 결과, 2010년에 해당하는 두 개의 레코드가 성공적으로 변경되었습니다.
업데이트 결과 확인
테이블의 레코드를 다시 한 번 조회해 보겠습니다.
mysql> select * from DemoTable1924;
실행 결과는 다음과 같습니다.
+----------+-----------------+ | UserName | UserJoiningDate | +----------+-----------------+ | Robert | 10/12/2010 | | David | 20/01/2011 | | Robert | 20/01/2010 | | Carol | 26/04/2013 | +----------+-----------------+ 4 rows in set (0.00 sec)
위 출력에서 볼 수 있듯이 UserJoiningDate의 연도가 2010인 Chris와 Mike의 이름만 'Robert'로 변경되었고, 나머지 레코드는 그대로 유지되었습니다.
참고로 이 방식은 WHERE 절에서 컬럼에 함수를 적용하기 때문에 인덱스를 활용하지 못할 수 있습니다. 대량의 데이터를 자주 조회한다면 날짜를 DATE 타입 컬럼으로 저장하거나, 연도 값을 별도 컬럼으로 관리하는 것이 성능 면에서 더 유리합니다.