【问题标题】:Trailing zeros omitted when inserting to postgres插入到 postgres 时省略尾随零
【发布时间】:2020-06-18 20:15:20
【问题描述】:

虽然在 PostgreSQL 中插入包含零的毫秒部分的日期是跳过。如果日期中有非零部分,它将正确插入到数据库中。

例如:2019-06-01 11:59:59:371Z 这将正确插入到数据库中,但是当我插入'2010-06-21 11:59:59:010Z' 时将变为'2010-06-21 11:59:59:01Z' 最后一个零部分被跳过。

我用了一个查询

SELECT to_char(date, 'YYYY-MM-DD HH:MI:SS:MSZ') 
FROM table_name; 

然后我将正确获取数据,但它是字符串格式,如果我更改为 time.Time 格式,则会跳过零部分。

是否有任何方法可以强制存储毫秒而不会将零跳过到 postgres 或任何解决此问题的方法

2099-06-21T23:59:59.371Z -> 2099-06-21T23:59:59.371Z
2099-06-21T23:59:59.000Z -> 2099-06-21T23:59:59Z
2099-06-21T23:59:59.010Z -> 2099-06-21T23:59:59.01Z
2010-06-21T23:59:59.001Z -> 2010-06-21T23:59:59.001Z
2010-06-21T23:59:59.100Z -> 2010-06-21T23:59:59.1Z

【问题讨论】:

  • 如果to_char() 显示正确,则值存储正确。所以它一定是你在程序中检索值的方式切断了毫秒
  • 是的,我正在使用 golang 所以将此字符串转换为 time.Time 然后它将再次从结果中跳过零。我想要这个时间数据。时间数据类型。我使用日期:=“2018-10-24T18:50:23.010Z”parse_time,_:=时间.解析(时间.RFC3339,日期)
  • 这是表示层问题,不是数据库问题。数据库将其存储为数字,最后的零无关紧要。为什么你需要它有零?
  • 另一端期望“2018-10-24T18:50:23.010Z”格式的数据。是解决此问题的任何其他方法。
  • @aswathy 扫描到time.Time 时出现什么错误?您尝试扫描的 db 值的类型是什么?您使用的是什么数据库驱动程序?例如,如果您从 postgres db 中选择 timestamp 或 timestamptz 值,并使用 github.com/lib/pq 驱动程序,然后将该值直接扫描到 *time.Time,那么一切都应该自动运行,应该没有错误,至少我知道我从来没有遇到过。

标签: postgresql date go


【解决方案1】:

小数分隔符后面的尾随零与数字的准确性无关。

如果您的应用程序希望小数点分隔符后有某个固定位数,请在查询表时使用 to_char 函数适当地格式化时间戳。

如果您想避免在查询中添加to_char,请在表上定义一个将时间戳格式化为字符串的视图,并在查询中使用该视图。

无论如何,不​​要将时间戳作为字符串存储在表中。您会丢失有效性检查和日期运算,并且会浪费存储空间。

【讨论】:

  • 我可以在查询中使用to_char。但它会以文本格式返回输出。然后我使用to_timestamp 将字符串转换为时间。时间格式然后零被跳过
  • 您希望输出为字符串,否则尾随零将不重要。
  • 我想以 time.Time 格式输出而不跳过零
  • 没有跳过零,它们只是不存在。在内部,时间戳是从 2000-01-01 00:00:00 开始的微秒数。所以如果你想要别的东西,你想要文本格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多