我尝试使用.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在同一台电脑上。
答案 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客户端代码进行时区转换。