2010-11-09 22 views
2

J'ai un ensemble de données que je transmets à un service Web de style asmx. si je l'appelle la méthode « GetXml » sur DS, le contenu est affiché comme la chaîne suivante:Transférer des dates dans des ensembles de données sur plusieurs niveaux

<ChinaVisa> 
    <ChinaVisa> 
    <ChinaVisaId>5</ChinaVisaId> 
    <ReceiveDate>2010-11-07T23:00:14-05:00</ReceiveDate> 
    </ChinaVisa> 
</ChinaVisa> 

Je passe alors ce XML en tant que paramètre NTEXT à une procédure stockée. La procédure stockée (simplifiée) a le code suivant:

DECLARE @ChinaVisaHandle INT 

ALTER PROCEDURE [dbo].[UpdateOrder] 
(
    @xmlChinaVisa NTEXT 
) 
AS 

     EXEC sp_xml_PrepareDocument 
     @ChinaVisaHandle OUTPUT, 
     @xmlChinaVisa 
     SELECT 
     ChinaVisaId, 
     ReceiveDate 
     INTO #TempChinaVisa 
     FROM 
     OPENXML (@ChinaVisaHandle, '/ChinaVisa/ChinaVisa', 2) 
      WITH ([ChinaVisaId]  INT, 
        ReceiveDate  DATETIME 
        ) 

J'utilise ensuite les données dans le tableau #TempChinaVisa pour écrire à la table maître réelle.

UPDATE [ChinaVisa] 
    SET  
     ReceiveDate  = #TempChinaVisa.ReceiveDate 
    FROM #TempChinaVisa 
    WHERE #TempChinaVisa.ChinaVisaId = [ChinaVisa].ChinaVisaId 

Lorsque je questionne la table ChinaVisa, la DateRéception me est affiché réglé par une 5 heures de décalage, réglage essentiellement l'horodatage à l'heure GMT. (Je me rends compte que l'ensemble de données contenait ce décalage GMT -5 valeur.)

Résultat interrogeant la table cible de base de données:

SELECT ReceiveDate  FROM ChinaVisa 

    OrderId ReceiveDate  
    5 2010-11-08 04:00:00 

Cela m'a surpris un peu. Comme tous les niveaux d'application étaient locaux, je ne m'attendais pas à une conversion vers un autre fuseau horaire. La date saisie dans l'interface graphique, une fois convertie en un ensemble de données, incluait le décalage de fuseau horaire local de 5 heures. Lorsque j'ai utilisé Mgt Studio pour afficher la date, je suppose que Mgt Studio a dû décider si les dates affichées devaient être en heure locale ou GMT. Je m'attendais à ce que tout soit converti en local, mais puisqu'il l'a montré comme montré ci-dessus, il apparaît que ces Mgt Studio affichaient l'horodatage en heure GMT.

Bien qu'un peu surprenant, ce n'était pas alarmant. Cependant, lorsque mon application WinForm utilisait un service Web pour interroger les données, je m'attendais à ce que la date, lorsqu'elle était accédée par l'ensemble de données, soit automatiquement ajustée à l'heure locale de la même manière que lors de l'enregistrement dans la base de données. Ce n'était pas. Lorsque j'ai déplacé le ReceiveDate à un contrôle DateTimePicker, la date affichée était "2010-11-08 04:00:00".

Si j'ai effectué une autre sauvegarde pour prendre la date du contrôle DatePicker et l'enregistrer dans la base de données, cela aurait entraîné un ajustement inattendu de la date. Par conséquent, la valeur de la base de données change de 5 heures chaque fois que l'écran est actualisé à partir de la base de données et réenregistré, sans changer la valeur à l'écran.

Quelle est la manière correcte/la plus facile de gérer cette situation? Mon intuition est de convertir toutes les datitudes lues de la base de données en heure locale avant de les afficher, mais je ne suis pas sûr que ce scénario deviendrait plus compliqué si le serveur de base de données ou le niveau de service Web fonctionnait dans des fuseaux horaires différents.

Un conseil?

Répondre

0

En général, la manière la plus simple de gérer les dates sur un système distribué consiste à tout stocker en UTC et à convertir uniquement en temps local pour la présentation de l'utilisateur si nécessaire. À mes yeux rapides, votre situation semble ne pas être différente. Si vous en avez la possibilité, je recommanderais fortement de collecter/stocker/récupérer seulement datetime UTC. Essayer de mélanger manuellement les décalages de fuseau horaire, c'est inviter la folie et le désespoir.