Der beste Weg, um Daten vor 1000 n. Chr. In MySQL zu verarbeiten?

9

Ich erstelle eine Datenbank für Datensätze, die sich vor 1000 AD erstrecken, aber die Felder MySQL Date und DateTime unterstützen nur Datumsangaben ab 1000.

Gibt es eine Möglichkeit, die bequemer ist, als entweder einen Bigint-Typ zu verwenden, um Sekunden vor / nach dem 1.1.1970 mithilfe eines Unix-Zeitstempels zu zählen, oder zu einer Datenbanksoftware zu wechseln, die größere Datumsbereiche unterstützt?

David LeBauer
quelle
1
Dies wird ziemlich gut beantwortet bei SO: stackoverflow.com/q/2487543/514119
stanleykylee
@ Stanleykylee danke für den Hinweis. Die Frage war anders, aber das Problem tauchte in Kommentaren auf und wurde anschließend unter dem Motto "Wählen Sie ein Referenzdatum und verwenden Sie ein numerisches Feld" beantwortet, mit der Einschränkung "Es wäre mühsam zu codieren, aber ziemlich einfach". und meine Frage fragt unter anderem, ob dies die beste Alternative ist.
David LeBauer
Ah, das habe ich in der Frage irgendwie verpasst. Erlauben Sie mir, facepalm und entfernen Sie diese Kommentare ...
jcolebrand

Antworten:

7

Eine Alternative besteht darin, jeden Teil des Datums in einem numerischen Feld zu speichern. Sie hätten also drei Felder:

year  SMALLINT     # Store positive values for AD and negative for BC years.
month TINYINT
day   TINYINT

Auf diese Weise wäre es immer noch für Menschen lesbar. Der Wertebereich für verschiedene numerische Datentypen in MySQL finden Sie unter Übersicht über numerische Typen . Die Speicheranforderungen finden Sie unter Datentyp-Speicheranforderungen .

dabest1
quelle
1
Ich würde dies gerne mit +1 bewerten, aber ich bin mir ziemlich sicher, dass die Datumslogik schrecklich wäre, oder?
Camilo Martin
Wie wäre es mit einem einzelnen Feld, in dem wir Daten im numerischen Format für zB 2015-10-12 10:12:05
atpatil11
8

Kein nativer RDBMS-Datumsdatentyp wird für Anwendungen verwendet, die sehr alte (und für einige, sogar entfernte zukünftige) Daten erfordern.

Wenn ich Sie wäre, würde ich einen Zeichenfolgentyp für den nativen Speicher verwenden und mich an ein ortsrelevantes Format halten, z. B.: + JJJJ-MM-TT, um BC / AD und jedes vorhersehbare historische oder vernünftige zukünftige Datum aufzunehmen.

Wenn es helfen könnte, könnten Sie eine Bibliotheksklasse erstellen, die Ihr internes Speicherformat in ein ansehnlicheres für die UI-Ebene konvertiert. Sie können sogar Bibliotheksfunktionen einschließen, die in einen nativen Datumstyp konvertiert werden, wenn Ihre bevorzugte Sprache die Daten unterstützt, die Sie in Ihrer Datenbank haben werden.

Joel Brown
quelle
1
Wenn Sie SQL Server 2008+ verwenden, ist DATETIME2 die Antwort . Zeitraum: 1. Januar 1 n. Chr. Bis 31. Dezember 9999 n. Chr.
Nick Chammas
1
Guter Vorschlag. Für andere Systeme würde ich zusätzlich eine CHECKEinschränkung empfehlen , um ein Datumszeichenfolgenformat zu erzwingen. Leider erzwingt MySQL keineCHECK Einschränkungen.
Nick Chammas
2
@Nick, stimmte DATETIME2 in SQL Server 2008+ zu (ich werde 1753 vermissen), aber OP beginnt mit MySQL als seinem Anteil am Boden. Auch DATETIME2 fällt ab, sobald Sie den 31. Dezember 1 v. Chr. Zu Ihrem Kalender hinzufügen müssen :)
Joel Brown
1
Sie können jederzeit eine BIToder eine BOOLEANSpalte hinzufügen , um die Datumspolarität anzuzeigen. :) Wenn Sie das tun, sind Sie natürlich auf sich allein gestellt, wenn Sie Berechnungen an diesen "BC" -Daten durchführen. Wer weiß, welche Art von Kalenderanpassungen, die normalerweise von Bibliotheksfunktionen für uns vorgenommen werden, bei der Manipulation der "falschen" BC-Daten
übersehen werden
1
Mark, der Grund, warum ich eine Zeichenfolge empfehlen würde, ist, dass sie, solange Sie sie richtig formulieren, ohne Verarbeitung für den Menschen lesbar (und teilweise sogar bearbeitbar) ist und Sie relativ einfach spezielle Datumsmanipulationsfunktionen erstellen können. Das Speichern von Daten als Zahlen ist furchtbar, furchtbar unpraktisch, es sei denn, Sie verfügen über eine Funktionsbibliothek, die diese Art der Kodierung für bloße Menschen interpretieren kann. Wenn eine solche Bibliothek vorhanden ist, ist es natürlich weitaus sinnvoller, ein Datum als Zahl zu kodieren.
Joel Brown
1

Wie wäre es mit einem einzelnen Float-Feld in einer Tabelle, in dem Daten in numerischem Format gespeichert werden, z. B. 2015-10-12 10:12:05, wird 20151012 gespeichert. 101205. Es ist immer besser, nach einem einzelnen Feld zu sortieren, anstatt 3 oder mehr zu haben unterschiedliche Gebiete.

Die obige Logik funktioniert für einige Szenarien nicht. Daher haben wir das Datum in Sekunden umgerechnet, wobei 1 Tag = 86400 Sekunden berücksichtigt wurde. Wird für BC-Daten negativ verwendet. Es funktioniert wie erwartet.

atpatil11
quelle
1
negative Zahlen für BC?
Rob Sedgwick
1
151012 und 150819 wären beide in 15AD, -151109 wäre in 15BC
Rob Sedgwick