繁体   English   中英

PostgreSQL 中是否有一种本地技术可以强制“没有时区的时间戳”不包括毫秒?

[英]Is there a native technique in PostgreSQL to force "timestamp without time zone" to not include milliseconds?

我正在使用 PostgreSQL 9.6.17。 (从 MySQL 迁移)

Java 程序在表中写入日期。 日期格式如下: 2019-01-01 09:00:00

但它也可以是2019-01-01 09:00:00.002019-01-01 09:00:00.000插入数据库时​​,这会在检索时弄乱我程序中的日期管理。

在插入时,我希望所有日期都具有相同的格式: 2019-01-01 09:00:00 该列使用的数据类型是timestamp without a time zone

如何通过配置或 SQL 查询告诉 postgresql 在timestamp without timezone输入毫秒?

数据类型文档未提供任何相关信息。

从手册中引用

time、timestamp 和 interval 接受一个可选的精度值 p,它指定保留在秒字段中的小数位数。 默认情况下,没有明确的精度限制。 p 的允许范围是从 0 到 6

所以只需将您的列定义为timestamp(0) ,例如:

create table foo
(
   some_timestamp timestamp(0)
);

如果您有一个包含数据的现有表,您可以简单地更改列:

alter table some_table 
   alter column some_timestamp type timestamp(0);

如果您现在插入一个带毫秒的时间戳,该值将被四舍五入以删除毫秒。

请注意,从技术上讲,您的存储值仍然有毫秒,但它们始终设置为0

你可以cast

mytimestamptz::timestamp(0)

这会将结果四舍五入到最接近的秒。 如果要截断,请改为:

date_trunc('second', mytimestamp)
  1. 作为时间戳检索,并在查询数据库的应用程序中,根据需要管理精度。 例如。 通过JDBC,您将获得一个Java LocalDateTime 对象,在Python 中,您将获得一个日期时间对象。

  2. 如果要将时间戳作为字符串检索,有很多可用格式选项

    SELECT to_char(when, 'YYYY-MM-DD HH24:MI:SS') FROM mytable
  3. 通过 为时间戳类型指定 精度选项来删除输入的任何毫秒数:

     CREATE TABLE mytable (..., when TIMESTAMP(0));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM