【问题标题】:Remove TIMESTAMP precision from NOW() result in PostgreSQL?从 NOW() 结果中删除 TIMESTAMP 精度在 PostgreSQL 中?
【发布时间】:2012-08-21 18:05:39
【问题描述】:

有什么方法可以从 PostgreSQL 中的 NOW() 函数的结果中去除精度?

"2012-08-21 10:23:34.867502"

我正在寻找的格式是:

"2012-08-21 10:23:34"

我正在尝试使用以下 SQL 更新“没有时区的时间戳”类型的列:

UPDATE table SET column = now();

谢谢!

【问题讨论】:

  • 它有什么害处吗?如果列类型不支持,数据库应该简单地跳过毫秒。
  • 很高兴知道,谢谢。我不确定它是否会影响任何事情。

标签: sql postgresql datetime timestamp


【解决方案1】:

简单的答案是将其转换为零精度。

select now()::timestamptz(0);

【讨论】:

  • + 这个方法保持时区
  • select now()::timestamp(0);用这个
【解决方案2】:
UPDATE tbl SET col = DATE_TRUNC('second', NOW());

请参阅DATE_TRUNC 的文档。

【讨论】:

  • 谢谢你,pilcrow。我正在梳理文档,但在任何地方都找不到。我想我找错地方了。
  • @littleK 在新代码中,可能值得使用 SQL 标准时间函数 current_timestamp 等,而不是 NOW() 或(更糟的)'now'::timestamp。见postgresql.org/docs/current/static/…
【解决方案3】:

您可以在 pgAdmin 3 中将列的长度移动到 0 或使用 timestamp(0) 创建表时更改表的结构:

CREATE TABLE public.users
(
    id integer serial,
    username character varying(255) NOT NULL,
    email character varying(255) NOT NULL,
    password character varying(255) NOT NULL,
    created_at timestamp(0) without time zone NOT NULL,
    updated_at timestamp(0) without time zone NOT NULL,

    CONSTRAINT users_pkey PRIMARY KEY (id)
);

但是如果你这样做,如果你尝试插入一个毫秒的时间戳,就会发生错误。

【讨论】:

    【解决方案4】:

    根据您的要求,另一个选项是调整时间戳列本身的精度 - 将其精度设置为 0。这在将 PostgreSQL 与不处理时间戳中的小数秒的旧程序一起使用时非常有用。

    【讨论】:

      【解决方案5】:
      select now()::timestamp(0);
      

      在上一个答案中选择now()::timestamptz(0); 仍然保留时区。

      【讨论】:

        猜你喜欢
        • 2019-05-02
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多