{"id":100,"date":"2010-03-05T17:15:31","date_gmt":"2010-03-05T16:15:31","guid":{"rendered":"http:\/\/www.smartersoftware.de\/wordpress\/?p=100"},"modified":"2010-03-05T17:09:00","modified_gmt":"2010-03-05T16:09:00","slug":"putzige-sachen-datum-im-neuner-komplement","status":"publish","type":"post","link":"http:\/\/www.smartersoftware.de\/wordpress\/2010\/03\/putzige-sachen-datum-im-neuner-komplement\/","title":{"rendered":"Putzige Sachen: Datum im Neuner-Komplement"},"content":{"rendered":"<blockquote>\n<p>F\u00fcr englisch-sprachige Leser: There is an <a href=\"http:\/\/www.smartersoftware.de\/wordpress\/english\/wild-stuff-nines-complement-date-format.html\">English version of this post<\/a>.<\/p>\n<\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; margin-left: 0px; margin-right: 0px\" src=\"http:\/\/farm1.static.flickr.com\/32\/99434806_f2d7dbc12e.jpg\" width=\"500\" height=\"333\" \/>&#160; <br \/><em><font size=\"1\">Forto von <\/font><\/em><a href=\"http:\/\/www.flickr.com\/photos\/80835774@N00\/\"><em><font size=\"1\">Picture Taker 2<\/font><\/em><\/a>,<em><font size=\"1\"> flickr.com<\/font><\/em><\/p>\n<p>Dies ist ein Eintrag, aus dem hoffentlich eine ganze Serie von putzigen Sachen wird, die mir so \u00fcber den Weg laufen: Seltsame Formate, Verschl\u00fcsselungen oder Datenmodellierungs-Entscheidungen.<\/p>\n<p>Dieser Eintrag beschreibt ein Datumsformat, das wir als \u2018Neuner-Komplement\u2019 bezeichnen. Ich konnte dazu nichts bei Wikipedia finden, und Google lieferte nur einen Verweis auf eine obskure IBM-Dokumentation. <\/p>\n<h2>Beobachtung<\/h2>\n<p>In einer SAP Maske gab es ein Datumsfeld \u201cG\u00fcltig Bis\u201d. Hier kann man ein Datum eingeben, bis zu dem eine Information g\u00fcltig ist (z.B. bis \u201831.12.2006\u2019). In der Datenbank konnten wir schnell eine \u2018VALIDTO\u2019 Spalte finden, dort standen aber seltsame Werte wie &#8216;79938768 &#8216;, die nicht wie ein Datum aussahen. Die Spalte war als CHAR(8) definiert, was nicht ungew\u00f6hnlich f\u00fcr Datums-Felder ist: Speichert man das Datum im Format \u2018YYYYMMDD\u2019, so kann man mit einer normalen numerischen Sortierung auch die entsprechenden Daten (Dat\u00fcmer \ud83d\ude09 ?) sortieren. In diesem Fall w\u00e4re das obige Beispiel-Datum als \u201820061231\u2019 abgelegt.<\/p>\n<p>Es hat eine Weile gedauert, bis wir hinter die seltsamen Werte in der Datenbank kamen: Man muss dann YYYYMMDD von 99999999 abziehen. Hier ist die vollst\u00e4ndige Ableitung:<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\" width=\"400\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"200\">Datum<\/td>\n<td valign=\"top\" width=\"200\">31.12.2006<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"200\">im Format YYYYMMDD<\/td>\n<td valign=\"top\" width=\"200\">20061231<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"200\">&#160;<\/td>\n<td valign=\"top\" width=\"200\">&#160;<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"200\">8 Neunen<\/td>\n<td valign=\"top\" width=\"200\">99999999<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"200\">minus formatiertes Datum<\/td>\n<td valign=\"top\" width=\"200\">20061231<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"200\"><u>Datum im Neuner-Komplement<\/u><\/td>\n<td valign=\"top\" width=\"200\"><u>79938768 <\/u><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Wenn man die Werte in der Datenbank wieder in das richtige Format konvertieren will, kann man die gleichen Schritte in umgekehrter Reihenfolge durchf\u00fchren (d.h. wenn man den Wert von 8 Neunen abzieht, erh\u00e4lt man ein Datum im&#160; YYYYDDMM-Format). <\/p>\n<h2>Und wozu ist das gut? <\/h2>\n<p>Auf Nachfragen wurde folgende Erkl\u00e4rung f\u00fcr dieses Format geliefert: Das neuste Datum steht so an erster Stelle, so dass man damit eine absteigende Sortierreihenfolge simulieren kann, wenn diese nicht direkt unterst\u00fctzt wird, etwa bei der Definition von Indices.<\/p>\n<p>Dies k\u00f6nnte durchaus sein, schlie\u00dflich ist dieses Format im SAP Kontext aufgefallen und SAP hat eine komplexe Abstaktionsschicht \u00fcber die verschiedenen Datenbanksysteme gelegt. Ich hege immer noch die Vermutung, dass die SAP eine datenbankunabh\u00e4ngige Indizierung der Datenbank implementiert hat, auch wenn heute SAP-Indices in der Regel direkt auf der Datenbank umgesetzt werden.<\/p>\n<p>Mir ist aber nicht klar, wozu die Definition einer absteigender Reihenfolge in einen Index wichtig sein soll. Ich habe eine <a href=\"http:\/\/stackoverflow.com\/questions\/2370875\/when-would-you-define-an-index-with-a-descending-order\">Frage auf StackOverflow<\/a> dazu gestellt, und die Antworten darauf schildern ziemlich obskure Situationen. Solange Sachen wie Cluster-Tabellen keine Rollen spielten, sollte die Reihenfolge eines Index nicht wichtig sein. Egal ob man eine Sortierung mit ORDER BY, eine Suche nach einem Wert mit bin\u00e4re Suche oder dem Durchwandern eines B-Baum vornimmt, sollte die Sortierreihenfolge keinen wesentlichen Einfluss auf die Leistung haben. <\/p>\n<p>Es w\u00e4re sehr interessant, die Performance einer &quot;normalen&quot; Ablage als Datum und eines aufsteigenden Indexes auszuprobieren. Ich bin mir ziemlich sicher, dass man heutzutage keine gro\u00dfen Unterschiede feststellen kann. Vermutlich gibt es f\u00fcr dieses Format also nur Gr\u00fcnde, die heute nicht mehr zutreffen. Wahrscheinlich stammt das Format werden von einigen &quot;alte COBOL-Mainframe-Programmierern&quot; aus den Tagen, als man nur sequentiellen Zugriff auf eine Band-Datei zur Verf\u00fcgung hatte &#8230; <\/p>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr englisch-sprachige Leser: There is an English version of this post. &#160; Forto von Picture Taker 2, flickr.com Dies ist ein Eintrag, aus dem hoffentlich eine ganze Serie von putzigen Sachen wird, die mir so \u00fcber den Weg laufen: Seltsame Formate, Verschl\u00fcsselungen oder Datenmodellierungs-Entscheidungen. Dieser Eintrag beschreibt ein Datumsformat, das wir als \u2018Neuner-Komplement\u2019 bezeichnen. Ich [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[24],"class_list":["post-100","post","type-post","status-publish","format-standard","hentry","category-deutsch","tag-putzigesachen"],"_links":{"self":[{"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/posts\/100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/comments?post=100"}],"version-history":[{"count":2,"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/posts\/100\/revisions"}],"predecessor-version":[{"id":104,"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/posts\/100\/revisions\/104"}],"wp:attachment":[{"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/media?parent=100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/categories?post=100"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.smartersoftware.de\/wordpress\/wp-json\/wp\/v2\/tags?post=100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}