java.util을 저장합니다.밀리초의 정밀도로 MySQL DB의 날짜
mariaDB를 밀리초 단위로 정확하게 만들고 싶습니다.조사 결과 columnDefinition을 변경해야 한다는 것을 알게 되었습니다.그래서 엔티티에서 다음과 같이 했습니다.
@NotNull
@Column(name = "createdDate", columnDefinition = "DATETIME(3) NOT NULL")
@Temporal(TemporalType.TIMESTAMP)
private TimeStamp createdDate;
@PrePersist
void onPersist() {
createdDate = new Timestamp(new Date().getTime());
}
컬럼을 작성하기 위한 SQL은 다음과 같습니다.
`createdDate` DATETIME(3) NOT NULL
이제 DB에서 값은 실제로 3개의 소수점을 가집니다.
2016-09-12 16:57:44.000
...하지만 그들은 항상 000입니다.
내가 뭘 잘못했나요, 아니면 뭘 잊어버렸나요?
편집: JAVA 없이 시도했습니다.
CREATE TABLE `test` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`createdDate` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
그 후:
INSERT INTO test (createdDate)
VALUES(current_timestamp())
결과:
2016-09-13 13:57:44.000
MariaDB와 날짜 타입에 대해서도 같은 문제가 있었습니다.해봤어요org.joda.DateTime
그리고.java.util.time
타입. 서버와 클라이언트코드가 모두 밀리초를 올바르게 서포트하고 있습니다.
문제는 MariaDB Connector/JDBC 드라이버가 아닌 MySQL Connector를 사용하고 있다는 것입니다.
배경
MySQL Connector와 MariaDB를 함께 사용하는 것은 대부분의 상황에서 잘 작동하지만, 저는 절대 이것을 권장하지 않습니다.문제를 검색할 때 휴지 상태 코드와 커넥터 코드를 사용하여 디버깅을 하면 실제 기능 검출이 아닌 서버 버전 번호에 기반한 많은 기능 검출이 확인되었습니다.물론 MySQL과 MariaDB의 버전 번호는 다릅니다.따라서 무시되는 호환성 문제가 훨씬 더 많을 수 있습니다.
대부분의 경우 날짜와 타임스탬프를 혼재시키는 것이 문제입니다.의 변경createdDate
을 타이핑하다.java.sql.Timestamp
문제를 해결할 수 있을 겁니다.
또한 MySQL 버전이 5.6.4 이전인 경우DateTime
시간 분율을 절약할 수 없습니다.
OP 편집 후 편집:
이렇게 해도 Date Java 타입과 타임스탬프를 혼재하고 있습니다.
createdDate = new Timestamp(new Date().getTime());
한번 해 볼래?createdDate = new Timestamp(System.currentTimeInMilliseconds());
대신?
이러한 문제를 피하기 위해 Joda Time과 같은 라이브러리의 개체를 사용하는 것이 이상적이지만, 이는 질문의 요점을 벗어난 단순한 힌트입니다.
최종적으로 이 방법으로 타임스탬프를 작성할 수 없는 경우 Datetime 대신 DB의 타임스탬프 유형을 사용할 수 있지만 Datetime도 마찬가지이므로 시행착오일 뿐입니다.
편집 : Oracle의 Date API에서 발췌:
Date()
Allocates a Date object and initializes it so that it represents the time at which it was allocated, measured to the nearest millisecond.
이 경우,System.currentTimeInMilliseconds()
결과를 바꾸면 안 돼요. 제 잘못이에요.
이 문제를 해결하기 위해 CURRENT_TIMESTamp를 사용하여 SQL을 통해(JAVA 객체를 통과하지 않고) 날짜를 생성하여 필드에 10진수 시간 정밀도를 확실히 포함하도록 하겠습니다.문제가 없으면 디버거를 사용하여 Java 개체의 값을 확인합니다.단서가 될 수 있을 거야둘 다 밀리초를 포함하는 경우 주석의 사용법을 살펴보거나 작업 샘플에서 시작합니다.
순수 JPA를 사용하여 이를 수행하려면 다음 절차를 따릅니다.
@Column(name="STMP", columnDefinition = "TIMESTAMP (6)")
private Timestamp timestamp = Timestamp.from(Instant.now());
언급URL : https://stackoverflow.com/questions/39464821/save-a-java-util-date-in-a-mysql-db-with-millisecond-precision
'programing' 카테고리의 다른 글
컴파일된 Java 클래스를 잠그는 방법은 무엇입니까? (0) | 2022.12.29 |
---|---|
공식 PHP Docker 이미지 접근 방식을 사용하여 php-redis 확장을 설치하는 방법은 무엇입니까? (0) | 2022.12.29 |
localhost에서 Docker MySQL 컨테이너에 연결하시겠습니까? (0) | 2022.12.29 |
범용 메서드를 사용하는 경우 및 와일드 카드를 사용하는 경우 (0) | 2022.12.29 |
.class용 Java 동기 블록 (0) | 2022.12.29 |