PostgreSQL:不带时区的时间戳的不同输出取决于客户端

PostgreSQL:不带时区的时间戳的不同输出取决于客户端,postgresql,datetime,Postgresql,Datetime,我对我的PostgreSQL数据库在没有时区的时间戳(0)中返回不同的结果感到困惑。假设我有一个表t create table t ( x timestamp(0) without time zone ); insert into t select now(); 现在,当我从不同的客户端运行select*fromt时,我会得到不同的输出 PSQL:2014-04-06 10:22:57 JDBC:2014-04-06 10:22:57:000(驱动程序postgresql-9.3-1

我对我的PostgreSQL数据库在没有时区的
时间戳(0)中返回不同的结果感到困惑。假设我有一个表
t

create table t (
    x timestamp(0) without time zone
);
insert into t select now();
现在,当我从不同的客户端运行
select*fromt
时,我会得到不同的输出

  • PSQL:
    2014-04-06 10:22:57

  • JDBC:
    2014-04-06 10:22:57:000

    (驱动程序postgresql-9.3-1101.jdbc4.jar在

  • 节点pg:
    太阳2014年4月6日10:22:57 GMT+0200(CEST)


在这三种语言中,只有PSQL是我所期望(和需要)的输出。为什么会发生这种情况?我如何在不必显式转换查询的情况下修复它?

如果希望数据库返回时间戳的特定字符串格式,通常应该在查询中请求它

to_char(the_timestamp_col, 'YYYY-MM-DD HH:MI:SS')

或者,您可以使用客户机应用程序语言的功能来根据需要格式化时间戳。对于功能更丰富的语言,这通常是更好的选择


虽然PostgreSQL通常通过查询协议返回日期的特定文本格式,但客户端可以自由选择使用二进制协议,在这种情况下,它们将在数秒内获得一个大的整数值。与其依赖PostgreSQL协议中的值按您想要的格式进行格式化,不如确切地询问您需要什么。

将数据库表示转换为带时区的时间戳。时期它不会改变存储,它增加了精度。如果没有时区,时间戳的精度为+/-24小时。

时间戳
存储在数据库中,没有任何格式。格式化始终由显示数据的应用程序完成。通常,您可以将SQL客户端配置为将特定格式应用于
时间戳
(和
日期
)列。只要您从结果集中检索一个真正的
java.sql.Timestamp
实例(例如,使用
ResultSet.getTimestamp()
),这个客户端格式就不重要了。@a_horse_没有名字是的,我只是不希望node pg将其解析为
数据
对象-我期望的是原始字符串值。阅读文档,对吗?我将重写类型解析器。您可能不知道每个连接甚至每个查询都有这样做的方法?我不知道node pg,所以我不知道
数据
对象是什么。但是输出似乎是对
java.sql.Timestamp
实例调用
toString()
的结果。您是否只是使用从
ResultSet
获取的对象调用
System.out.println()
。如果是的话,那么一切看起来都很好。只需使用
java.sql.Timestamp
实例就可以了。我的意思是日期。很抱歉给你带来了困惑。我没有使用Java,JDBC只是用于我正在使用的Eclipse插件。我使用的是JavaScript(node.js),这将非常困难,因为我一般都在查询同步:我有一个表
journal
,它以
sequence number | table_name | row | operation
的形式保存对数据库的更改,并基于此动态构建查询。因此,处理查询将需要大量的代码开销。那么,您必须在客户端按数据类型进行操作。依靠协议格式是不明智的。为什么你认为这是不明智的?看看答案的最后一个标准。您还依赖于客户端驱动程序的功能。我不明白为什么不在客户端格式化日期。因为我的同步算法是对数据类型进行抽象的。它基本上只是读取日志中显示的数据,并将其发送到Android应用程序,然后写入应用程序的数据库。这是双向同步,所以算法基本上是彼此的镜像。两者都不容易对数据进行后处理。精度?为什么我要存储时区数据,那么我应该如何向不同时区的用户显示?我更喜欢发送/存储utc,直到需要向用户显示日期为止。如果您知道是utc,为什么不告诉数据库?发送没有时区信息的非utc日期不是一个选项,我认为“没有时区”是错误的只意味着UTC