2014-04-07 1 views
1

.net 및 Npgsql을 사용하여 postgres에서 저장 프로 시저를 실행하여 now() 값을 반환하려고합니다. 내가 서버에서 실행하는 경우npgsql 쿼리가 다이렉트 서버 쿼리와 다른 현재 값을 얻는 이유

그러나

select aa_realtime2(); 

내가 얻을 내가 ": : 07 33.015 + 02 22 2014년 4월 7일"얻을

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

.NET에서 실행

"2014-04-07 15 : 38 : 11.734-04 : 30"

현지 시간은 gmt -4 : 30이므로 서버가 정상입니다.

Postgres와 .net 앱은 동일한 PC에 있습니다.

답변

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 = ‘…' 

먼저 하나되는 서버가 어떤 시간대를 지정하는 데 사용됩니다. 또는 - 뭔가 다른 것을 변경하지 않는 한 기본 시간대가 사용됩니다. 기본값입니다.

주어진 데이터베이스와 사용자에 대해 다음 두 가지 기본값이 변경됩니다.

db 연결이 다른 설정에서 작동하도록하려면 마지막 하나를 사용할 수 있습니다. [...]

데이터베이스 연결이 단순히 다른 표준 시간대를 사용합니까?

+0

감사합니다. 두 문장 모두 문제를 해결할 수 있습니다. A) 저장소 proc 내에서 시간대를 설정하거나 B) 사용자를 변경 ... set timezone = '...' –

1

PgJDBC, nPgSQL 등의 대부분의 클라이언트 드라이버는 UTC로 작동하며 응용 프로그램 내에서 UTC로 변환 할 것을 기대합니다. 그래서 그들은 TimeZone 세션 변수를 UTC으로 설정합니다.

대조적으로 psql은 기본적으로 운영 체제의 표준 시간대 인 서버 기본값 인 TimeZone을 남깁니다.

.net에서 쿼리의 현지 시간을 원하면 AT TIME ZONE 연산자를 사용하여 명시 적으로 시간대를 변환하는 것이 좋습니다. 또는 UTC로 날짜를 가져오고 .net 클라이언트 측 코드로 시간대 변환을 수행하십시오.

관련 문제