Java Postgresql:在创建表期间指定默认时区
我对Java Postgresql:在创建表期间指定默认时区,java,sql,postgresql,jdbc,timezone,Java,Sql,Postgresql,Jdbc,Timezone,我对员工的定义如下表 CREATE TABLE employees ( id integer NOT NULL, name text, withouttz timestamp without time zone, withtz timestamp with time zone, CONSTRAINT primarykey_emp PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE employees OWNER TO
员工的定义如下
表
CREATE TABLE employees
(
id integer NOT NULL,
name text,
withouttz timestamp without time zone,
withtz timestamp with time zone,
CONSTRAINT primarykey_emp PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE employees
OWNER TO chris;
我以以下方式插入了两条记录:
INSERT INTO employees(
id, name, withouttz, withtz)
VALUES (1, 'test', '2011-01-01 00:00:00', '2011-01-01 12:00:00+03');
INSERT INTO employees(
id, name, withouttz, withtz)
VALUES (2, 'test', '2011-01-01 00:00:00', '2011-01-01 12:00:00');
我为select*from employees
编写了简单的java类,它输出以下内容:
col1: 1
col2: test
col3: 2011-01-01 00:00:00
col4: 2011-01-01 07:00:00-8:00
col1: 2
col2: test
col3: 2011-01-01 00:00:00
col4: 2011-01-01 12:00:00-8:00
问题:
有没有办法创建一个带有时区的postgres表的时间戳
,以便它将时区视为UTC而不是服务器的本地时区
注:将时区设置为“GMT”代码>不是我的解决方案,因为它只在特定会话中工作。此外,如果解决方案根本不依赖于服务器的本地时区,那就太好了
提前感谢时区是会话参数。设置会话的时区相对简单。另见:
将时区设置为“GMT”代码>将完成此操作
编辑:我想你可以在时区“GMT”试试代码>,但我不确定两者之间的区别
编辑2:正如克雷格·林格(Craig Ringer)所说,以下内容似乎正是你想要的
alterdatabase…
设置它的数据库级别。如果你把它换成
postgresql.conf
它是全局的。有关详细信息,请参阅手册
日期、时间和时间戳在SQL中非常笨拙
我怀疑在这种情况下,你想写的是:
TIMESTAMP 'blah blha blah' AT TIME ZONE 'UTC'
这将定义一个localtime时间戳(不需要转换),然后明确地将其视为UTC时间的timestamptz。@null.pointer正如我在问题中非常清楚地说的,将时区设置为“GMT”
不是我的解决方案。请再次阅读postgresql文档中关于时区的文档。时区基于客户端,而不是服务器。设置时区无疑是一个解决方案。此外,您可以检查PGTZ环境变量以使其自动化。为什么不将+00
作为TZ偏移量传递,而不是在第一次插入中传递+03
,或者在第二次插入中传递为空?这就是UTC在timestamptz
文本中的表达方式。在您的示例中,不清楚您没有预料到结果的确切部分,或者您想要什么。@Chris-“设置时区”对您来说是一个解决方案,因为它不仅仅适用于单个会话。您可以将其应用于集群范围内的特定数据库或特定用户。有关详细信息,请参阅精美手册。哦,这与服务器的本地时区无关,而是与客户端有关。花些时间阅读日期/时间处理手册。这很复杂,但必须如此。@RichardHuxton感谢您的回复。我刚刚在PostgreSQL9.1+Ubuntu13.04上再次测试了它。我可以再次确认,它仅在会话级别有效。此外,我想在吃饭时提出一个解决方案creation@Chris除非您想将自己的逻辑编码到数据库中,否则您实际上无法在数据库中处理此问题。@null.pointer当然,您可以在数据库中处理此问题。chris-要么您没有将该设置应用于数据库,要么您正在客户端中重写它。你也不明白什么是时间戳。请花点时间阅读手册中的日期/时间和配置设置-它们解释得非常清楚。@Chris如果您使用SET
it's session level。如果使用设置本地
,则为事务级别。如果您使用alteruser。。。设置它的用户级别。如果您使用alterdatabase。。。设置它的数据库级别。如果您在postgresql.conf
中更改它,它是全局的。有关详细信息,请参阅手册。