【问题标题】:change postgres date format更改 postgres 日期格式
【发布时间】:2011-07-01 01:23:53
【问题描述】:

有没有办法改变 Postgres 中日期的默认格式?

通常当我查询 Postgres 数据库时,日期显示为 yyyy-mm-dd hh:mm:ss+tz,例如 2011-02-21 11:30:00-05。

但是一个特定的程序日期出来的是yyyy-mm-dd hh:mm:ss.s,也就是说,没有时区,它显示十分之一秒。

显然有些东西正在改变默认日期格式,但我不知道是什么或在哪里。我不认为它是服务器端配置参数,因为我可以使用不同的程序访问同一个数据库,并且我可以使用时区获取格式。

我很在意,因为除了更改格式之外,它似乎还忽略了我的“设置时区”调用。所有时间都是美国东部标准时间。

附加信息:

如果我写“从某个表中选择某个日期”,我会得到“无时区”格式。但如果我写“select to_char(somedate::timestamptz, 'yyyy-mm-dd hh24:mi:ss-tz')”,那么时区会按我的预期工作。

在我看来,这听起来像是将所有时间戳隐式设置为“to_char(date::timestamp, 'yyyy-mm-dd hh24:mi:ss.m')”。但是我在文档中找不到任何关于如果我愿意我将如何执行此操作的内容,我也无法在代码中找到任何似乎可以执行此操作的内容。虽然我不知道要寻找什么,但这并不能证明太多。

没关系:'(

我发现了我的问题。我在想我正在直接查看从数据库返回的字符串。但我忽略了它正在将其作为时间戳读取,然后将时间戳转换为字符串。这被隐藏在一个名为“getString”的函数中,这让我很失望。我以为它是 ResultSet.getString,但它实际上是我们自己的同名函数。哎呀。哪个白痴写了这个功能?!哦,原来是我……

感谢所有试图提供帮助的人。我会为你的麻烦给你一个赞成票。

【问题讨论】:

  • 因此,请将您的发现添加为答案,并接受它,这样这个问题就会以一个接受的答案结束。

标签: sql postgresql date


【解决方案1】:

我相信表格列的指定方式不同。试试这些变体:

timestamp
timestamp(0)   no millis
timestamptz    with timezone
timestamptz(0) with timezone, no millis

【讨论】:

  • 但有趣的是,我的问题是我正在查看相同的列,只是使用了两个不同的程序。根据程序,我得到不同的输出格式。这告诉我其中一个程序必须正在做一些事情来改变格式。
  • 你怎么知道程序没有把日期格式化成日期值本身呢?唯一的官方程序是 psql,所有其他软件都将这些值作为日期值检索,并且软件可以随意格式化。
  • 不同的输出是什么样的?
【解决方案2】:

您使用哪个客户端运行选择语句?格式化输出是应用程序的责任,因此如果不知道您使用哪个应用程序来显示数据,就很难分辨。

假设您使用的是 psql,您可以使用SET 命令更改日期格式:
http://www.postgresql.org/docs/current/static/sql-set.html

这本质上是一种更改配置参数的方法。负责格式化数据的记录在此处:
http://www.postgresql.org/docs/current/static/runtime-config-client.html#RUNTIME-CONFIG-CLIENT-FORMAT

【讨论】:

  • 我在 Java 程序中使用 JDBC 接口。当我说“格式化输出”时,我的意思是当我将时间戳作为字符串读取时得到的。也就是说,我运行“从 ... 中选择事务日期”,然后在 Java 中我在字段上使用 ResultSet.getString,根据运行查询的程序,我得到不同的格式。
  • 是的,在发布问题之前,我发现了“set datestyle”调用,但似乎并非如此。这只给出了四种格式选择,而且它们都没有小数秒和时区。还是我错过了什么?
  • 我认为 ResultSet.getString() 不受 Postgres 会话设置的影响。如果您确实需要时间戳作为字符值,我建议您在查询中使用to_char() 来控制格式。或者使用 ResultSet.getTimestamp() 并使用 SimpleDateFormat 在您的 Java 程序中对其进行格式化
  • a_horse_with_no_name:查看我对自己问题的回答。简要地说:是的,我认为您是正确的,没有设置可以像这样更改格式。我对格式化的位置感到困惑。
【解决方案3】:

Daniel 告诉我将我的发现作为答案发布并接受它以结束问题。好的。

我发现我看到的不包含时区的日期格式不是直接来自 Postgres 的,而是我缺少几个函数调用,它们将传入日期转换为 java.lang. util.Timestamp,然后从java.util.Timestamp 到一个String。正是在从 Timestamp 到 String 的转换中,时区默认为 EST。

在我自己谦虚的辩护中,我的错误并不像听起来那么愚蠢。 :-0 我们在一个子类中执行查询,将结果读入一个列表,我们这样做是为了允许在输出之前修改查询结果。 (在这种情况下,我们添加了一组从存储的列派生的列。)然后我们有一组类似于 JDBC 函数的函数来从 List 中提取数据,因此调用程序可以轻松地从处理中切换直接处理列表的查询。当我在处理日期格式问题时,我并没有注意到我不是在看“真正的 JDBC”,而是在看“模拟的 JDBC”调用。

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 2016-11-22
    相关资源
    最近更新 更多