2016-06-05 4 views
0

내 스키마에서 TIMESTAMP 열을 피하고 이전의 한정된 범위 때문에 대신 DATETIME을 사용하고 싶습니다 (Year 2038 problem 참조). 따라서, 나는이Slick 3.x에서 LocalDateTime에서 SQL-DateTime으로 범위 보존 매핑을 수행하는 방법은 무엇입니까?

def valueDate = column[LocalDateTime]("VALUE_DATE", SqlType("DateTime"))(localDateTimeColumnType) 

처럼 내 열을 정의하고 암시 적 매핑을 제공 (I 어딘가에 웹에서 그것을 가지고) :

이 작동
implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
    d => Timestamp.from(d.toInstant(ZoneOffset.ofHours(0))), 
    d => d.toLocalDateTime 
) 

만의 java.sql.Timestamp를 사용하여 내 DB 열이 DATETIME 인 경우에도 여전히 제한된 범위로 고통 받고 있습니다. 내가 문자열 기반의 매핑을 사용하려고하지만 작동하지 않습니다

implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, String](
    d => d.format(DateTimeFormatter.ofPattern("YYYY-MM-DD HH:MM:SS")), 
    d => LocalDateTime.parse(d, DateTimeFormatter.ofPattern("YYYY-MM-DD HH:MM:SS")) 
) 

을 몇 가지 이유를 들어, 삽입 문 (퓨처스 onFailure 콜백이 호출됩니다) 실패합니다. 나는 작동 범위를 유지하는 매퍼가 어떻게 생겼는지 궁금해. 어떤 아이디어?

+1

'string' 버전으로'onFailure'에 들리는 오류 메시지는 무엇입니까? – Gustek

+0

콜백에서 예외를 캡처하는 방법을 알지 못했습니다. 내가 그것을보고 메시지가 "필드 DayOfYear 157 값이 2의 최대 인쇄 폭을 초과로 인쇄 할 수 없습니다"입니다. 형식 문자열이 잘못되었습니다. 나는 이것을 문서화 할 답변을 게시 할 것이다. – binford

답변

0

확인 1 단원 : 오류 메시지를 읽습니다.

플레이 콜백에서 예외 메시지를 표시하는 방법을 학습 후 나는이있어 :

필드 DAYOFYEAR 157 그것은 밝혀졌다 2

의 최대 인쇄 폭을 초과하는 값으로 인쇄 할 수 없습니다 내 DateTime 형식은 쓰레기입니다. here을 읽을 수 있으므로 형식은 YYYY-MM-DD HH : MM : SS 대신 yyyy-MM-dd HH : mm : ss이어야합니다. 올바른 매핑은 다음과 같습니다 :

implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, String](
    d => d.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), 
    d => LocalDateTime.parse(d, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) 
)