Dapper.net으로 Postgres에서 DateTimeOffset을 읽는 방법?

dapper datetimeoffset postgresql

문제

이 Postgres 테이블을 가짐

CREATE TABLE "TimeRange"
(
  "Id" bigint NOT NULL,
  "Start" timestamp with time zone NOT NULL,
  "End" timestamp with time zone NOT NULL,
  CONSTRAINT "TimeRange_pkey" PRIMARY KEY ("Id")
)

그것을 채우기

INSERT INTO "TimeRange"("Id", "Start", "End")
VALUES (1, '2014-03-03 05:55:00+01', '2014-03-03 05:55:00+01');

이 C # POCO가 있음

public class TimeRange
{
    public long Id { get; set; }
    public DateTimeOffset Start { get; set; }
    public DateTimeOffset End { get; set; }
}

데이터 선택 중 ..

myOpenedNpgsqlConnection.Query<TimeRange>("SELECT * FROM \"TimeRange\"");

.. DataException의 결과 : "열 1 구문 분석 오류 (시작 = 03.03.2014 05:55:00 - DateTime)"

오류 메시지에 표준 시간대 정보가 없다는 것을 알고 있습니다. PgAdmin에서 동일한 sql 문을 실행하면 시간대 정보가 포함 된 결과가 반환됩니다.

거기에 (깨끗한) 방법을 Postgres "시간대와 타임 스탬프"를 통해 Dapper를 DateTimeOffset으로 읽을 수 있습니까?

편집하다:

나는 다음과 같이 POCO를 수정하는 것이 효과가있는 것으로 나타났습니다. 그러나 진지하게, 더 좋은 방법은없는가?

public class TimeRange
{
    public long Id { get; set; }
    private DateTime Start { get; set; }
    private DateTime End { get; set; }

    public DateTimeOffset StartOffset { get { return this.Start; } set { this.Start = value.UtcDateTime; } }
    public DateTimeOffset EndOffset { get { return this.Start; } set { this.Start = value.UtcDateTime; } }
}

인기 답변

PostgreSQL은 내부적으로 UTC 타임 스탬프 만 저장합니다. 아마 당신이 SQL 쿼리에서 시간대 정보를 캐스팅한다면 PostgreSQL은 클라이언트 세션에서 TZ를 사용합니다.

CREATE TABLE TimeRange
(
  Id bigint NOT NULL,
  start_at timestamp with time zone NOT NULL,
  end_at timestamp with time zone NOT NULL,
  CONSTRAINT TimeRange_pkey PRIMARY KEY (Id)
);

INSERT INTO TimeRange (Id, start_at, end_at)
VALUES (1, '2014-03-03 05:55:00+01', '2014-03-03 05:55:00+01');


SELECT 
  id, 
  start_at::TIMESTAMP WITH TIME ZONE as start, 
  end_at::TIMESTAMP WITH TIME ZONE as end 
FROM TimeRange;


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.