programing

java.util을 저장합니다.밀리초의 정밀도로 MySQL DB의 날짜

goodsources 2022. 12. 29. 20:34
반응형

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

반응형