Home
Datenquellen
Controllflow
DataFlow
SSIS
ToC
Impressum
Datum und Uhrzeit im Internetformat verarbeiten (W3CDateTime)

Ein Dauerbrenner bei der Arbeit mit SSIS ist und bleibt das Datum und die Uhrzeit. In der Praxis werden wir mit den unterschiedlichsten Datumsformaten konfrontiert.

Dieses Mal möchte ich mich mit dem Datum auseinandersetzen, wie es gerne im Internet oder von Webservices geliefert wird. Selbstverständlich gibt es dafür einen RFC-Standard (ISO 8601 Datum).

Ein Datum und Uhrzeit im verbreiteten Internet Format (UTCDateTime oder ISO 8601 Format) kann mit den Bordmitteln von Integration Services nicht in ein Datum (DT_DBTIMESTAMP) umgewandelt werden.

Aber es gibt ja immer noch die Script Transformation im Datenfluß und das .Net Framework. In den Tiefen des .Net Framework 2.0 finden sich einige Funktionen, die genau für das Parsen von unterschiedlichen Datumsformaten vorgesehen sind.

Speziell für das Parsen von Datumsangaben in XML Dateien oder Webservices Ausgaben gibt es die Funktion System.XML.XmlConvert. Diese Funktion versucht beim parsen nach einander ungefähr 20 verschiedene Datumsformate die im Internet gebräuchlich sind zu erkennen. Wenn ein Format ein gültiges Datum liefert, dann wird dieses zurückgegeben. Damit ist diese Funktion sehr flexibel.

Immer wenn wir Daten verarbeiten, müssen wir die Daten auch kennen. Deshalb kann es sinnvoll sein, nicht mit so einem universellen Werkzeug an die Lösung der Aufgabe zu gehen.
Intern benutzt die Funktion System.XML.XmlConvert eine andere Funktion aus dem .Net Framework 2.0: System.DateTime.ParseExact.

Der Funktion System.DateTime.ParseExact wird ein oder mehrere entsprechende Formatstrings übergeben mit deren Hilfe der Datumswert geparst wird. Damit bekommen wir genau die Kontrolle, die wir brauchen. Zusätzlich sind wir etwas schneller als mit der Funktion System.XML.XmlConvert, da genau ein String zum parsen verwendet wird.

Falls wir auf ein ungültiges Datum stoßen, wird allerdings von der Funktion System.DateTime.ParseExact eine Ausnahme (Exception) erzeugt, die wir im Scriptcode mit Hilfe von Try und Catch abfangen müssen. Das kostet richtig viel Zeit.

Eine Datei mit ungefähr 500.000 Datenzeilen wird in ungefähr 10 bis 15 Sekunden komplett verarbeitet, wenn alle Datumsangaben gültig sind. Wird aber kein einziges Datum in der Datei als gültig erkannt, so dauert die Verarbeitung durch die Ausnahmebehandlung ungefähr 10 Minuten.

Auch für diese Situation findet sich im .Net Framework 2.0 eine Funktion, System.DateTime.TryParseExact die genau so arbeitet wie wir es brauchen. Wird kein gültiges Datum erkannt, so wird keine Ausnahme (Execption) erzeugt, sondern einfach kein Wert zurück gegeben. Danach könnten wir die Zeilen ohne gültiges Datum über eine Bedingtes Teilen Transformation ausfiltern.

Selbstverständlich können wir mit dieser mächtigen Funktion auch jedes andere beliebige Datumsformat oder wenn es sein muss, auch mehrere Formate verarbeiten.

Den Kode aus der Scripttransformation finden Sie hier.

Wie viel kostet all der Luxus, den uns das .Net Framework 2.0 zur Verfügung stellt? Wird ein Datum mit den Standardmethoden von Integration Service verarbeiten können sind wir natürlich am schnellsten.

Zu meiner Überraschung ist die Funktion System.XML.XmlConvert nur ungefähr 5 % Prozent langsamer als die Funktion System.DateTime.TryParseExact. Bei der Verarbeitung von  ungefähr 500.000 Datensätze konnte ich diesen  Performancenachteil feststellen. Allerdings liegt dieser Wert noch innerhalb der Schwankungsbreite der einzelnen Ergebnisse und damit innerhalb der Messungenauigkeit.

Damit Sie wirklich die Kontrolle über das Parsen des Datums ausüben können, die Sie brauchen, empfehle ich Ihnen die Funktion System.DateTime.TryParseExact, auch wenn es etwas aufwendiger ist, die jeweiligen Datumsformate selbst zu definieren.

Liste der Datumsformate, die die Funktion System.XML.XmlConvert nacheinander ausprobiert (extrahiert mit dem Programm Reflector von Lutz Roeder):

"yyyy-MM-ddTHH:mm:ss.FFFFFFFzzzzzz"
"yyyy-MM-ddTHH:mm:ss.FFFFFFF"
"yyyy-MM-ddTHH:mm:ss.FFFFFFFZ"
"HH:mm:ss.FFFFFFF"
"HH:mm:ss.FFFFFFFZ"
"HH:mm:ss.FFFFFFFzzzzzz"
"yyyy-MM-dd", "yyyy-MM-ddZ"
"yyyy-MM-ddzzzzzz"
"yyyy-MM", "yyyy-MMZ"
"yyyy-MMzzzzzz"
"yyyy"
"yyyyZ"
"yyyyzzzzzz"
"--MM-dd"
"--MM-ddZ"
"--MM-ddzzzzzz"
"---dd"
"---ddZ"
"---ddzzzzzz"
"--MM--"
"--MM--Z"
"--MM--zzzzzz"

Hier finden Sie ein Beispielpaket.

Bitte achten Sie darauf, dass der Verbindungsmanger an Ihre Umgebung angepasst werden muss.
Die Rohdatendatei, die erzeugt wird, wird standardmäßig nach C:\ geschrieben. Durch das Ändern der Variable RawFile kann diese Einstellung geändert werden.
Als Datenziel wird die Trash Komponente verwendet.

Komponentenindex:

  • Flatfilequelle
  • Multicast Transformation
  • Union All Transformation
  • Scipt Transformation
  • Trash Datenziel

letzte Änderung 10.10.2006