PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 20/03/2012 16:33:31

Gold.Strike
Membre

Exception liée à un timestamp with timezone

Bonjour,

J'utilise une base de données Postgre SQL avec une application développée en C#.
Dans une des tables de la base, il y a des champs au format : "timtestamp with timezone".
Dans certains cas, cela provoque une exception dans l'application : "L'exception System.InvalidCastException s'est produite : La chaîne n'a pas été reconnue en tant que DateTime valide.".

J'ai du mal à comprendre cette erreur, qui ne concerne qu'une date, ayant format suivant :
"1012-03-20 10:00:34+00:17:30"

Alors que les autres dates ne posent pas de problème :
"2010-11-15 18:05:43+01"
"2010-12-10 09:35:53.016415+01"

Comment on peut obtenir un timezone = 00:17:30?
S'agit il d'un problème à la sauvegarde?

J'ai mis à jour le npgsql de ma solution, en passant du 2.0.7 au 2.0.11 mais cela ne change rien.

Merci d'avance

Hors ligne

#2 20/03/2012 16:53:12

rjuju
Administrateur

Re : Exception liée à un timestamp with timezone

Bonjour.
Effectivement ce timezone n'est pas valide.
Quelle est la version de postgresql ?

Il faudrait commencer par identifier s'il s'agit d'une requête générée par votre application ou vraiment de la valeur d'un champ contenu en table.

Si cela provient bien d'un champ en table, vous pouvez essayer de trouver la ou les lignes ayant ce problème, faire un dump et voir si le champ est toujours dans ce format, de l'exporter en enlevant le timezone pour le remettre après.

Dernière modification par rjuju (20/03/2012 16:57:18)

Hors ligne

#3 20/03/2012 17:10:19

Gold.Strike
Membre

Re : Exception liée à un timestamp with timezone

La version de Postgre est la 9.0.

Et il s'agit bien d'un champ en table. Ce champ correspond dans l'application à une date de séance, initialisée à la date du jour, mais pouvant être modifié par l'utilisateur. Ce qui est "étrange", c'est qui on modifie l'année de cette date, dans une période allant de 1899 à 2012, la date est correctement sauvegardée. Par contre, si on prends une année inférieur ou égale à 1890, on retrouve une date ayant comme timzone "+00:17:30" dans la base de données...

Hors ligne

#4 20/03/2012 17:36:03

Gold.Strike
Membre

Re : Exception liée à un timestamp with timezone

Il semblerait que les dates soient gérées correctement jusqu'au 01/05/1892 à 11h42, mais qu'en dessous, cela provoque mon erreur :
"1892-05-01 12:00:03+00"
"1892-05-01 13:00:39+00"
"1892-05-01 08:00:14+00:17:30"
"1892-05-01 10:00:44+00:17:30"
"1892-05-01 11:59:21+00"
"1892-05-01 11:00:36+00:17:30"
"1892-05-01 11:30:09+00:17:30"
"1892-05-01 11:45:00+00"
"1892-05-01 11:40:15+00:17:30"
"1892-05-01 11:42:42+00"
"1892-05-01 11:41:07+00:17:30"

Cela semble lié à la gestion historique des timezone?
http://archives.postgresql.org/pgsql-ge … g01132.php

Je vais probablement passer ma colonne au format "timestamp without timezone"...

Hors ligne

#5 20/03/2012 17:50:39

rjuju
Administrateur

Re : Exception liée à un timestamp with timezone

Effectivement je viens de faire le test et le timezone est bien positionné à +00:17:30, mais ce timezone ne gêne pas l'utilisation avec la libpq.

L'exception remontée provient de .net et non de postgres, donc c'est au niveau de l'application qu'il faut corriger ce problème. Je ne sais pas si ce timestamp est une spécificité de postgresql ou si c'est dans la norme sql.

Si vous avez besoin de gérer des dates inférieures à 1890, je ne vois pas d'autre solution que de caster la zone en timestamp simple, si quelqu'un d'autre ici a déjà été confronté au problème il pourra sans doute vous répondre.

Edit: Effectivement, au vu de votre lien il s'agit d'un héritage de la gestion des fuseaux horaires qui n'est pas simple. Si .net ne gère pas ces spécificités, il ne doit pas y avoir d'autre choix que de passer en timestamp sans timezone.

Dernière modification par rjuju (20/03/2012 17:55:58)

Hors ligne

Pied de page des forums