PostgreSQL의 TIMESTAMP 값이 반올림됨

8914 단어 PostgreSQLtech
PostgreSQL의 TIMESTAMP의 초 필드에서 소수점 이하 6자리보다 작은 값을 지정하면 예상치 못한 날짜와 시간을 반올림하여 설정할 수 있다.
TIMESTAMP 초 필드의 정밀도는 소수점 이하 0~6자리 범위에서 지정할 수 있습니다.
INSERT INTO foo
VALUES (1, TIMESTAMP '2021-12-31 23:59:59')
     , (2, TIMESTAMP '2021-12-31 23:59:59.9')
     , (3, TIMESTAMP '2021-12-31 23:59:59.99')
     , (4, TIMESTAMP '2021-12-31 23:59:59.999')
     , (5, TIMESTAMP '2021-12-31 23:59:59.9999')
     , (6, TIMESTAMP '2021-12-31 23:59:59.99999')
     , (7, TIMESTAMP '2021-12-31 23:59:59.999999')
     , (8, TIMESTAMP '2021-12-31 23:59:59.9999999');
# SELECT * FROM foo;
 id |          foo_time
----+----------------------------
  1 | 2021-12-31 23:59:59
  2 | 2021-12-31 23:59:59.9
  3 | 2021-12-31 23:59:59.99
  4 | 2021-12-31 23:59:59.999
  5 | 2021-12-31 23:59:59.9999
  6 | 2021-12-31 23:59:59.99999
  7 | 2021-12-31 23:59:59.999999
  8 | 2022-01-01 00:00:00  <- 四捨五入されて日付がかわる
(8 rows)
다음, 발견될 때까지 필기

TIMESTAMP 열이 있는 테이블 준비하기


CREATE TABLE foo
(
    id       INTEGER,
    foo_time TIMESTAMP
);

LocalDate 및 Local TimeMAX를 사용하여 TIMESTAMP 열의 값을 만들고 INSERT를 진행합니다.


LocalDate 및 Local TimeMAX를 사용하여 TIMESTAMP 열의 값을 생성합니다.
제작 준비2022-01-01 23:59:59.999999999의 기록.
O/R Mapper는 JOQ를 사용합니다.
val date = LocalDate.of(2022, 1, 1)

dslContext
    .insertInto(FOO, FOO.ID, FOO.FOO_TIME)
    .values(1, date.atTime(LocalTime.MAX))
    .execute()

예상과 다른 INSERT 결과를 반환합니다.


INSERT 결과를 확인하기 위해 SELECT를 시도해보면 2022-01-01 23:59:59.99999999가 아니라 다음날2022-01-02 00:00:00이다.
# SELECT * FROM foo;
 id |      foo_time
----+---------------------
  1 | 2022-01-02 00:00:00
(1 row)

좋은 웹페이지 즐겨찾기