为什么npgsql查询获得不同的now值作为直接服务器查询

时间:2014-04-07 20:30:56

标签: postgresql npgsql

我尝试使用.net和Npgsql在postgres中执行存储过程以返回now()值。

从.net

运行
strSQL = "select aa_realtime2();"
cmd = New NpgsqlCommand(strSQL, connRead)
strSQL = cmd.ExecuteScalar()

我得到" 2014-04-07 22:07:33.015 + 02"

但是如果我从服务器

运行
select aa_realtime2();

我得到" 2014-04-07 15:38:11.734-04:30"

我的当地时间是gmt -4:30所以服务器还可以。

Postgres和.net app在同一台电脑上。

2 个答案:

答案 0 :(得分:2)

对我来说,这两个值看起来就像是在不同时区给出的非常相似的时间。

我想引用http://www.depesz.com/2014/04/04/how-to-deal-with-timestamps/,因为它讨论了类似的问题。

  

[...]   好吧,每当处理timestamptz值时,如果时区不是   指定 - PostgreSQL使用配置的时区。

     

您可以通过多种方式对其进行配置:

timezone “GUC" in postgresql.conf
alter database … set timezone = ‘…'
alter user … set timezone = ‘…'
SET timezone = ‘…'
     

第一个用于指定服务器所在的时区。要么 -   除非其他内容发生变化,否则将使用的默认时区   默认。

     

接下来的两个更改了给定数据库和用户的默认值。

     

如果您希望数据库连接工作,可以使用最后一个   不同的设置。   [...]

您的数据库连接是否可能只使用不同的时区?

答案 1 :(得分:1)

大多数客户端驱动程序(如PgJDBC,nPgSQL等)都可以在UTC中运行,并希望您在应用程序中转换为/从UTC转换。因此,他们会将TimeZone会话变量设置为UTC

相比之下,默认情况下psql会将TimeZone保留为服务器默认值,即操作系统的时区。

如果您想从.net中的查询获得本地时间,我建议使用AT TIME ZONE运算符显式转换时区。或者以UTC格式获取日期,并使用.net客户端代码进行时区转换。