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 !