타입핸들러 7
to_char(trunc(months_between(trunc(sysdate , 'DAY') , TO_DATE(birth , 'YYYYMMDD' ) ) / 12 )) AS YEARS
에 대한
package com.example.typehandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
public class AgeTypeHandler extends BaseTypeHandler {
private static final DateTimeFormatter BIRTH_FORMAT =
DateTimeFormatter.ofPattern("yyyyMMdd");
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return calculateAge(rs.getString(columnName));
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return calculateAge(rs.getString(columnIndex));
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return calculateAge(cs.getString(columnIndex));
}
private String calculateAge(String birth) {
if (birth == null || birth.length() != 8) {
return null;
}
LocalDate birthDate = LocalDate.parse(birth, BIRTH_FORMAT);
// Oracle TRUNC(MONTHS_BETWEEN(...)/12) 와 거의 동일
int years = Period.between(birthDate, LocalDate.now()).getYears();
return String.valueOf(years);
}
}
댓글
댓글 쓰기