Zur Zeit wird gefiltert nach: datetime
Filter zurücksetzen
SQL Server Datum gem. ISO 8601 parsen
Ich hatte ein kleines Problem, dass sehr schnell Zeit bei der Fehlersuche beanspruchen kann. Das Problem bezog sich bei mir auf einen ETL-Job. Eine Datenquelle liefert nur das Jahr und den Monat. Hiermit müssen schon beim Laden kleine Differenz-Berechnungen gemacht werden. Bevor ich hier eigene Logik entwickle, kam mir die DATEADD-Funktion in den Sinn. Diese Funktion benötigt aber ein Datum.
Je nach Umgebung kann das Datum aus einem String wie zum Beispiel '23.05.2010' im Format 'DD.MM.YYYY' ermittelt werden (DIN 5008), ändert sich aber die Umgebung funktioniert dies nicht mehr. Ein möglicher Ansatz wäre der Tausch von Monat und Tag, damit es wieder funktioniert. Das eigentliche Problem ist damit jedoch nicht behoben, denn wenn im Hintergrund des Ladejobs ein Configuration Repository arbeitet, ist es eine Frage der Zeit, bis ein Fehler auftritt.
T-SQL DECLARE @Year int, @Month int SET @Year = 2010 SET @Month = 5 SET LANGUAGE GERMAN PRINT CONVERT(DATETIME,'23.' + STR(@Month) + '.' + STR(@YEAR)) SET LANGUAGE ENGLISH -- Fehler out-of-range PRINT CONVERT(DATETIME,'23.' + STR(@Month) + '.' + STR(@YEAR)) -- Quick and Dirty Korrektur PRINT CONVERT(DATETIME, STR(@Month) + '.' + '23.' + STR(@YEAR))
Ausgabe Die Spracheneinstellung wurde auf Deutsch geändert. Mai 23 2010 12:00AM
Changed language setting to us_english. -- Fehler out-of-range Meldung 242, Ebene 16, Status 3, Zeile 11 The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
-- Quick and Dirty Korrektur May 23 2010 12:00AM
Da es umgebungstechnisch mit dem Datum immer ein Problem darstellt, ist die Verwendung des ODBC - Datumsformat 'YYYY-MM-DD 00:00:00.000' empfehlenswert, da es auch der Norm ISO 8601 entspricht. Beim ersten Versuch funktioniert es auch wie erwartet.
T-SQL DECLARE @Year int, @Month int SET @Year = 2010 SET @Month = 5 SET LANGUAGE ENGLISH PRINT CONVERT(DATETIME, STR(@Year) + '-' + STR(@Month) + '-1')
Ausgabe Changed language setting to us_english. May 1 2010 12:00AM
Ändert sich jedoch die Umgebung, wird das Datum nicht korrekt wieder gegeben. Damit dieses Problem definitiv behoben werden kann, ist die explizite Angabe beim Konvertieren erforderlich. Für das ODBC-Datum inkl. Millisekunden ist es der Ausdruck 121.
T-SQL DECLARE @Year int, @Month int SET @Year = 2010 SET @Month = 5 SET LANGUAGE ENGLISH PRINT CONVERT(DATETIME, STR(@Year) + '-' + STR(@Month) + '-1') SET LANGUAGE GERMAN PRINT 'Fehlerhafte Interpretation' PRINT CONVERT(DATETIME, STR(@Year) + '-' + STR(@Month) + '-1') PRINT 'PARSE ODBC kanonisch (mit Millisekunden)' SET LANGUAGE GERMAN PRINT CONVERT(DATETIME, STR(@Year) + '-' + STR(@Month) + '-1', 121) SET LANGUAGE ENGLISH PRINT CONVERT(DATETIME, STR(@Year) + '-' + STR(@Month) + '-1', 121)
Ausgabe Changed language setting to us_english. May 1 2010 12:00AM Die Spracheneinstellung wurde auf Deutsch geändert. Fehlerhafte Interpretation Jan 5 2010 12:00AM PARSE ODBC kanonisch (mit Millisekunden) Die Spracheneinstellung wurde auf Deutsch geändert. Mai 1 2010 12:00AM Changed language setting to us_english. May 1 2010 12:00AM
Social Bookmarking