有没有办法让 CURRENT_TIMESTAMP 只在数据库中存储日期、小时和分钟?

Posted

技术标签:

【中文标题】有没有办法让 CURRENT_TIMESTAMP 只在数据库中存储日期、小时和分钟?【英文标题】:Is there a way to get CURRENT_TIMESTAMP to only store date, hours and minutes in a database? 【发布时间】:2019-09-15 13:13:06 【问题描述】:

我将数据存储在 PostgreSQL 中,其中一列设置为默认 CURRENT_TIMESTAMP。我试图将此默认设置为仅存储:日期、小时和分钟。有谁知道我该怎么做?

我需要能够使用 Ruby 操作数据,然后将其显示在 html 页面上。目前我可以显示这样的时间戳2019-09-15 12:50:05.745811,但我想要更像这样的时间戳:2019-09-15 12:50

目前,我将表的每一行提取到一个 Ruby 对象中,并将每个值定义为可访问的实例变量,因此 @id = id@content = content@timestamp = timestamp。我想要一种方法来编辑这样的字符串:2019-09-15 12:50:05.745811 in ruby​​ 或者我想可能更容易找到DEFAULT CURRENT_TIMESTAMP 仅存储相关数据的方法。任何帮助,非常感谢。

这就是我的表的创建方式:

CREATE TABLE my_table (
  id SERIAL PRIMARY KEY, 
  content VARCHAR(280), 
  timestamp timestamp DEFAULT CURRENT_TIMESTAMP
);

【问题讨论】:

【参考方案1】:

如果您总是希望您的日期分辨率只到秒,那么您可以在定义中指定:

CREATE TABLE my_table (
  id SERIAL PRIMARY KEY, 
  content VARCHAR(280), 
  timestamp timestamp(0) DEFAULT CURRENT_TIMESTAMP
);

如果您希望能够处理和/或显示小数秒,请在选择时进行转换:

Select ..., timestamp::timestamp(0) ...

当你想显示较少的第二个精度时,你必须使用 to_char(...) 并指定你想要的掩码,所以在你的例子中 2019-09-15 12:50:

select ... to_char(timestamp, 'yyyy-mm-dd hh24:mi:'), ...

恕我直言,将列命名为与数据类型相同的做法是非常糟糕的做法。它有时会导致混乱或错误。

【讨论】:

感谢您的解释,作为 Ruby 和数据操作的新手,我非常感谢。【参考方案2】:

使用to_char() 删除分钟后的所有内容,使用to_timestamp() 转换回timestamp

CREATE TABLE my_table (
  id SERIAL PRIMARY KEY, 
  content VARCHAR(280), 
  timestamp timestamp DEFAULT to_timestamp(to_char(current_timestamp, 'YYYY-MM-DD HH24:MI'), 'YYYY-MM-DD HH24:MI')
);

请参阅demo。

【讨论】:

谢谢,这让我稍微接近了我想要的显示方式,最后似乎仍然有一些尾随 00 秒。这是它的样子:2019-09-15 15:06:00 列的数据类型为时间戳。如果您不想要时间戳,则应将其声明为 varchar()。那么你只需要to_char(...)

以上是关于有没有办法让 CURRENT_TIMESTAMP 只在数据库中存储日期、小时和分钟?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite - current_timestamp 没有返回正确的时间?

CURRENT_TIMESTAMP 以毫秒为单位

Postgres中没有时区默认CURRENT_TIMESTAMP的字段TIMESTAMP的JPA模型类?

Mysql设置了 ON UPDATE CURRENT_TIMESTAMP,为什么没有更新

无法从 SQL Server 中的 CURRENT_TIMESTAMP 获取秒数

mysql如何让时间属性不自动更新