Comment lire DateTimeOffset de Postgres avec Dapper.net?

dapper datetimeoffset postgresql

Question

Avoir cette table 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")
)

Le remplir avec

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

Ayant ce C # POCO

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

Sélection des données ..

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

..results dans DataException: "Erreur lors de l'analyse de la colonne 1 (Start = 03.03.2014 05:55:00 - DateTime)"

Je suis conscient que les informations de fuseau horaire sont manquantes dans le message d'erreur. L'exécution de la même instruction sql dans PgAdmin renvoie des résultats comprenant des informations de fuseau horaire.

Existe-t-il un moyen (propre) de lire Postgres "timestamp with timezone" via dapper dans DateTimeOffset?

MODIFIER:

J'ai trouvé que modifier le POCO pour suivre semble fonctionner. Mais sérieusement, n'y a-t-il pas de meilleur moyen?

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; } }
}

Réponse populaire

Il semble que PostgreSQL stocke en interne uniquement l'horodatage UTC. Peut-être que cela aide, si vous convertissez les informations de fuseau horaire dans une requête SQL, PostgreSQL utilise la TZ de la session client.

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;


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi