2014-03-03 76 views
0

有了這個Postgres的表如何用Dapper.net從Postgres中讀取DateTimeOffset?

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\""); 

..results在DataExce ption:「Error parsing column 1(Start = 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; } } 
} 

回答

0

看來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;