有没有办法让 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 没有返回正确的时间?
Postgres中没有时区默认CURRENT_TIMESTAMP的字段TIMESTAMP的JPA模型类?
Mysql设置了 ON UPDATE CURRENT_TIMESTAMP,为什么没有更新