2016-06-11 12 views
1

Ich habe ein seltsames Problem, wenn Sie R ODBC verwenden, um eine Verbindung mit einer Access 2016-Datenbank herzustellen.Zugriff ODBC, der falsche Daten vor dem Jahr 1753 zurückgibt

Die Daten in R haben einen Unterschied von -28 Tagen mit Bezug auf die Daten aus der Access-Datenbank.

Zum Beispiel in Access: 1639-01-24; in R: 1638-12-27. Das Format des Datums in R ist "1638-12-27 LMT".

Um dieses Problem zu lösen, musste ich bekommen Datumsvariablen als String mit der Format Funktion:

Select format([date],'yyyy-mm-dd') ... 

Kann jemand erklären, warum dies geschieht?

+0

Könnte dies dem gregorianischen Kalender zusammenhängen? Der Unterschied ist zu groß. Was passiert mit neueren Daten (zB 20. Jahrhundert) –

+0

Ich denke, du hast Recht! Ich habe mit einem jüngeren Datum überprüft und es ist korrekt. –

+0

Aber für 17. Jahrhundert und 18. Jahrhundert gibt es Fehler, aber mit Schwankungen: 16 Tage von 1686; 6 Tage für 1732. Es ist sehr seltsam. –

Antwort

2

Obwohl der Feldtyp Access als "Datums- oder Uhrzeitwert zwischen den Jahren 100 und 9999" (ref) definiert wurde, scheint der Access ODBC-Treiber Probleme mit Datumsangaben vor dem 1. Januar 1753 zu haben konnte dies unter Verwendung der Microsoft Access Driver (*.mdb, *.accdb) unter RODBC und .NET System.Data.Odbc bestätigen.

1753-01-01 in Access von Access ODBC als 1753-01-01 (korrekt) zurückgeführt wird, aber
1752-12-31 in Access wird von Access ODBC als 1752-12-30 (falsch)

und, wie Sie gefunden haben, zurückgegeben, wird die Diskrepanz größer als wir gehen weiter in der Zeit zurück.

Es gibt auch einen Microsoft Knowledge Base-Artikel here für Probleme im Zusammenhang mit Access ODBC, wenn sie versuchen Daten einfügen vor 1753

Es ist wohl kein Zufall, dass 1753.01.01 der frühestmögliche Zeitpunkt für Der Spaltentyp in SQL Server. Weitere Einzelheiten über die Bedeutung dieses Datums,

What is the significance of 1/1/1753 in SQL Server?

Es gibt nur einen Date/Time Typ in Access ist so können wir den Wert auf so etwas wie DATETIME2 in SQL Server nicht konvertieren. Daher ist die beste Problemumgehung wahrscheinlich Format() zu verwenden, um den Datumswert in Text wie in der Frage erwähnt zu konvertieren.

Es ist auch erwähnenswert, dass die Access-OLE DB-Provider (Microsoft.ACE.OLEDB.12.0) zeigt nicht die gleichen Probleme mit Datumsangaben vor 1753