Index auf Datum und Uhrzeit [ERLEDIGT]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Index auf Datum und Uhrzeit [ERLEDIGT]

Beitrag von Manfred »

Hi,

mal wieder eine Frage zum Philosophieren.

Eine DB hat ein Datumsfeld "datum","D",8,0
und ein Feld für die Uhrzeit "zeit","C",8,0 (Format "HH:MM:SS")

ein Index auf das Datum ist klar -> DTOS(datum).

Was meint ihr, ob und wo man bei der Zeit aufpassen muß, wenn diese mit in den Index kommen soll? Es soll eigentlich nur dem feineren Unterscheidung dienen, sprich bei gleichem Datum wird eben noch die Zeit hinzugenommen, damit wirklich klar wird, wer an 1.Stelle steht und wer danach kommt. Beim Vergleich ist es auch klar: Die Punkte zwischen den Stunde, Minuten und Sekunden werden entfernt und es wird aus DTOS(datum) + Charrem(":",zeit) ein String gebaut.
Zuletzt geändert von Manfred am Di, 25. Nov 2008 14:20, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
da Deine Uhrzeit ein Zeichenfeld ist, weiß ich nicht, warum Du unbedingt die Trenner rausschmeissen willst?
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

das habe ich deshalb gemacht, weil ich beim Zusammenbau dann 2 Werte als Zahl vergleichen kann.

Grob dargelegt: If eine Zeit größer als die andere Zeit, dann prima, oder eben nicht. Erschien mir bisher immer recht logisch. Oder gibt es da auch noch einen anderen Trick, den ich bisher nicht erkannt habe? Einfach aus den beiden Strings wieder eine Zahl machen, die dann verglichen, oder abgezogen werden kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Du kannst die Strings direkt vergleichen, da sie die selbe Länge haben und Zahlen aufgrund ihrer ASCII-Sortierung zufällig zum gleichen Ergebnis führen wie bei einem Wertevergleich. Das geht dann mit oder ohne Doppelpunkt.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Ja gutte,

das gilt doch dann aber nur bei == oder <>, oder?

Wenn ich doch herausfinden will, was denn jetzt älter oder jünger ist, dann muß ich doch abziehen und das geht doch nur mit Zahlen und nicht mit Character.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Gerd König
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 193
Registriert: Fr, 09. Jun 2006 7:52
Wohnort: Nähe Sömmerda

Beitrag von Gerd König »

Hallo Manfred,

ich mache das so:

Datum mit DToS() in Stringfeld abspeichern, die Uhrzeit als String, so wie sie ist.

Dann kann man für den Index die beiden Strings einfach addieren und hat immer die korrekte Sortierung.

'nen schönen Abend
Gerd
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Gerd,

also direkt schon konvertiert wegschreiben in die DB. Hm, dann muß aber jedesmal beim Lesen und Schreiben daran gedacht und gewandelt werden.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2936
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von Wolfgang Ciriack »

Hallo Manfred,
Wenn ich doch herausfinden will, was denn jetzt älter oder jünger ist, dann muß ich doch abziehen und das geht doch nur mit Zahlen und nicht mit Character.
Schau dir mal zum Vergleichen von 2 Zeiten die Funktion TimeToSec aus den XbTools an.
Viele Grüße
Wolfgang
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Wolfgang,

das habe ich schon gemacht. Aber wie gesagt es geht um den kompletten String Datum + Uhrzeit, sonst muß man doch 2x vergleichen.

Aber meine eigentlich Frage sollte dahin zielen, ob es vernünftig ist die Zeit als Wert mit : Trenner in die DB und somit in einen Index zu schreiben, bzw. ob vielleicht jemand damit entsprechende Erfahrung gemacht hat, das er sagen könnte, alles klar, aber da oder dort muß man aufpassen.

Dass scheint aber wohl nicht der Fall zu sein.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Hallo Manfred,

ich mach dies so, indem ich diese beide Felder zusammen nehme.

dToC(FIELD->DATE)+ FIELD->ZEIT

Gruss Thomas
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Thomas,

das dürfte als Sortierkriterium in die Hose gehen. DTOC(datum) gibt z.B. "16.01.2007" zurück und damit hast Du ein Problem mit dem 16.01.2006. Bei DTOS(datum) wird daraus 20070116 und dann steht der 20060116 ganz woanders. Ich schätze mal, Du meintest aber wohl DTOS() ?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Thomas.

DtoC ist nicht empfehlenswert, da dies zur Folge hat, daß die Tabelle nach den Tagen der jeweiligen Monate sortiert wäre (1.2., 1.3., 1.4. usw.).
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Index auf Datum und Uhrzeit

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben: Eine DB hat ein Datumsfeld "datum","D",8,0
und ein Feld für die Uhrzeit "zeit","C",8,0 (Format "HH:MM:SS")
also wenn du mit "Zeit" rechnen willst, würde ich SECONDS() nehmen.
Damit kann du theoretisch auch bis zu 1/100 Sec. unterschiedem was
z.B. bei Videoschnitt wichtig ist um genau "das" Bild zu treffen wo der
"Schnitt" anfangen/enden soll.

Deshalb statt TIME() dan SECONDS() verwenden. Die Darstellung von
SECONDS() als "TIME" sollte kein Problem sein.

gruss by OHR
Jimmy
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

ja Sorry,

hab wie Manfred richtig erkannte DtoS() genommen.

Gruss Thomas
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

wegen dem Vergleich ist es egal ob du den Trenner ausnimmst, es spart halt nur 2 Byte je Datensatz und das kann sich lohnen.
Es macht auch dahingehend Sinn, weil der Trenner eventuell in anderen Ländern andere Zeichen verwendet, dann muss man aber anders zusammenbauen ...

Kleiner ist früher:

'20071504141312' < '20071504141313'

gleiches Ergebnis wie

'2007150414:13:12' < '2007150414:13:13'

Beim Vergleichen macht es also keinen Unterschied !

Ein Zahlenvergleich könnte aber wieder ein Genauigkeitsproblem bekommen (jetzt sind es schon 14 Stellen), daher würde ich den Stringvergleich vorziehen. So spart man sich auch 2 Konvertierungen.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hm,

jetzt bin ich überfordert. Wieso klappt es denn so, oder so? Das verstehe ich jetzt nicht. Ich glaube es ja (ohne es getestet zu haben), aber ich habe keine Erklärung dafür, warum es so ist. Auf den 1.Blick würde ich es nicht vermuten, dass man trotz Trennzeichen diesen Vergleich starten kann, als wäre es ein rein numerischer Wert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

was ist den der Unterschied von einem Stringvergleich zu einem Zahlenvergleich ?
Ein Stringvergleich vergleicht von Links jede Stelle mit der gleichen Stelle im anderen.
Ein Zahlenvergleich berücksichtigt die Wertigkeit der Stellen.
Sobald beide Vergleichsausdrücke gleich lang sind (wie Tom schon bemerkte), gibt es (außer mehr Zeichen) keinen Unterschied:

'20071504141312'
ist kleiner als
'20071504141313'

genauso wie

20071504141312
ist kleiner als
20071504141313

Nur wenn unterschiedlich lange Strings verglichen werden gibt es Unterschiede zum Zahlenvergleich; wobei Clipper und Xbase da noch eine Besonderheit haben (rechter String gibt die Vergleichslänge vor ...):

'92'
ist größer als
'12345'

aber

92
ist kleiner als
12345

daher muss man Zahlen in Stings notfalls links auffüttern, damit ein Stringvergleich stimmt:

'00092'
ist kleiner als
'12345'
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

naja,

und um diese Probleme zu umgehen, habe ich halt alles in Zahlen umgewandelt. Das klappt direkt und ich muß mir keinen Kopf machen, warum ich denn nun schon wieder etwas anderes bekomme als ich erwartet habe. Aber trotzdem Danke für den kleinen Exkurs.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
wann hast Du das denn in Zahlen umgewandelt?
Hoffentlich, nachdem Du Datum und Uhrzeit aneinandergehangen hast :!: :D

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

jaja, doof kann man sein, aber pfiffig.

VAL(DTOS(datum) + CHARREM(":",zeit))

so habe ich es ja auch am Anfang hier geschrieben. :wink:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Es macht auch dahingehend Sinn, weil der Trenner eventuell in anderen Ländern andere Zeichen verwendet ...
tja die Amis haben doch am/pm ... also doch statt TIME() dann vielleicht
STRZERO(SECONDS(),8,2) das ist international und auf 1/100 Sekunden
genau ( wenn du was vergleichen willst ...)

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Höhö,

wenn ich mal so weit bin, dass meine Programme im Ausland benutzt werden, dann werde ich ein Faß aufmachen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten