Somme date + time : 2 jours de décalage ? [MSSQL Server] - SQL/NoSQL - Programmation
Marsh Posté le 07-03-2007 à 13:41:24
personellement au moment d'injecter l'heure j'y collerai deja une date, sans doute 1900/01/01, histoire de ne pas avoir de surprise.
et histoire d'avoir une sécurité supplémentaire je me risquerai meme a un:
la_date+date_heure-trunc(date_heure) au moment ou je veux ma date/heure
Marsh Posté le 09-03-2007 à 09:25:44
Merci pour ta réponse,
J'ai pensé à ta première solution aussi, le souci c'est que je fais le bulk insert directement depuis un fichier texte duquel je ne maîtrise pas les données (i.e. ce sont des logs fournis par le système SPS de M$ et le format est comme ça point à la ligne ) ...
Finalement je me suis décidé pour une procédure stockée (que je transformerai peut-être en trigger à l'insert) qui rajoute deux jours à tous les champs "heure" dont l'année est inférieure à 1900 ... cela semble fonctionner pour le moment, on verra sur le long terme ...
Marsh Posté le 06-03-2007 à 10:14:48
Bonjour à tous,
J'ai une table SQL server qui contient entre autres ces trois champs (et leur type) :
ladate - datetime
heure - datetime
fulldate - datetime
"ladate" et "heure" sont peuplés via un bulk insert qui ne donne pas d'erreur. Seulement le fichier texte avec lequel je peuple ces champs contient une simple valeur pour la date (type 2007-02-15) et une simple valeur pour l'heure (type 12:33:57), c'est-à-dire pas des valeurs "datetime" au sens où l'entend MSSQL.
Pas grave, ça semble se stocker correctement mais en réalité si mon fichier texte contient :
2007-02-15;12:33:57
2007-02-16;14:35:00
2007-03-01;23:57:44
j'ai en réalité dans ma table MSSQL ceci :
ladate ; heure
2007-02-15 00:00:00.000 ; 1899-12-30 12:33:57.000
2007-02-16 00:00:00.000 ; 1899-12-30 14:35:00.000
2007-03-01 00:00:00.000 ; 1899-12-30 23:57:44.000
OK je peux comprendre : datetime étant un format devant inclure ET la date ET l'heure, si cette information n'est pas fournie au moment de l'insertion des données, MSSQL met une valeur par défaut (bien que je sois déjà surpris de ce "1899" ... il me semblait que c'était 1900 ou 1901 normalement)
Maintenant arrive mon problème :
Je définis le champs "fulldate" de type datetime, et avec la formula "(ladate + heure)". J'avais déjà fait une opération similaire dans le passé et ça fonctionnait à merveille. Seulement aujourd'hui j'ai ceci dans le champs fulldate :
2007-02-13 12:33:57
2007-02-14 14:35:00
2007-02-27 23:57:44
L'addition se fait bien, mais il y a un décalage de deux jours ! Cela semble compréhensible avec ce "30 décembre" au lieu d'un plus intuitif "1er janvier". Deux jours de décalage au départ, deux jours à l'arrivée
J'ai trouvé cet article sur un forum (forum Oracle mais le problème semble être sur MSSQL aussi) :
http://database.ittoolbox.com/grou [...] um-1319231
ça parle à peu près du même problème, mais je ne comprends ni l'explication (je n'ai défini aucun int - float et quelle est cette histoire de négatif?) ni la résolution (je ne peux apparemment pas utiliser une fonction -type DATEPART ou DATEADD- dans la "Formula" du champ sur MSSQL)
Qu'est-ce qui explique ce décalage de deux jours au moment où s'écrit la valeur "temps" ?
Quelqu'un a déjà-t-il/elle eu ce genre de problème et si oui connaîtrait une résolution ?
Message édité par ZeBix le 06-03-2007 à 10:51:06