Contrairement à SQL, XML admet un nombre de syntaxes importantes pour les dates, heures et horodatages. Ces syntaxes supportent toutes les fuseaux horaires.
Exemples valides en XML :
2017-10-12
2017-10-12Z
2017-10-12+02:00
12:23:34
12:23:34+02:00
2017-10-12T12:23:34
2017-10-12T12:23:34+13:00
2017-10-12T12:23:34-13:00
+02:00 représente un fuseau horaire.
Z représente une valeur exprimée en UTC.
La norme XML précise : https://www.w3.org/TR/xmlschema11-2/#dateTime
SQL n’a pas la notion de fuseau horaire, et les conversions XML vers SQL peuvent engendrer des écarts par rapport aux résultats attendus.
Par exemple, la requête suivante :
Produit le résultat :
La date obtenue correspond à la veille, et nous avons deux heures de décalage.
La raison de ce comportement est documentée chez IBM : https://www.ibm.com/support/knowledgecenter/fr/ssw_ibm_i_73/db2/rbafzscaxmltable.htm
Les valeurs temporelles sont donc converties dans le fuseau horaire UTC.
Afin de s’affranchir de cet effet, vous pouvez utiliser les fonctions indiquées :
fn:adjust-dateTime-to-timezone Adjusts an xs:dateTime value to a specific timezone, or to no timezone at all.
fn:adjust-date-to-timezone Adjusts an xs:date value to a specific timezone, or to no timezone at all.
fn:adjust-time-to-timezone Adjusts an xs:time value to a specific timezone, or to no timezone at all.
Exemple de syntaxe :
Résultat, plus conforme à ce que l’on attend :
Ces fonctions XQuery et XPath sont documentées ici : https://www.w3.org/TR/xpath-functions/#timezone.functions
Maintenant, prenez le bon temps !