Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Postgresql:在创建表期间指定默认时区_Java_Sql_Postgresql_Jdbc_Timezone - Fatal编程技术网

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
中更改它,它是全局的。有关详细信息,请参阅手册。