• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

2 fragen zu sql

Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
moin..
also ich hab folgendes problem... ich hab ne große tabelle die unter anderem 2 spalten enthält vom typ "datetime".
nun bin ich auf der suche nach einer möglichkeit die zeile zu bekommen, in der die differenz der beiden datumsangaben am geringsten ist...
ich hab zwar schon ne lösung, würde das ganze aber am liebsten MIT EINER EINZIGEN abfrage bewerkstelligen.
hat jemand ne idee wie das möglich ist?

zweite frage: ich bin leider nicht so der sql experte und mir fehlt einfach ne referenz über die ganzen sql befehle und deren syntax... gibt es sowas irgendwo zum download im internet? hab schon gegoogelt aber leider nix gefunden

thx
m.a.k.
 

Sas~iN~LoVe

Guest
sql ist ja nicht gleich sql. es gibt zwar glaub ich ne ansi-sql norm, aber die unterstützt jeder irgendwie nur unvollständig.

also tätest du gut daran, zu verraten um was für nen sql server es hier eigentlich geht (mysql, mssql, oracle, postgresql, usw...) und in welcher version und dann suchst du dir die betreffenden experten ;)
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
ah.. da sieht man dass ich keine ahnung von dem ganzen hab.
ich dachte sql wär auf allen systemen gleich und es wäre egal, ob man jetzt mit oracle, informix oder was auch immer arbeitet..

also ich setze nen mysql server in der version 4.0 ein.

und nun, help me plz :D
 

Sas~iN~LoVe

Guest
aber ich kenn mich gar nicht aus :ugly:

mit mysql erst recht nicht, das hab ich noch nie genutzt.

aber könnte irgendwie so in der art lauten:
SELECT * FROM Tabelle ORDER BY MIN(ABS(Tabelle.Feld1-Tabelle.Feld2)) LIMIT 1;

evtl. musst du die felder auch erst formatieren, ich weiss nicht, wie sich die MIN()-Funktion verhält.
ABS liefert den betrag einer zahl.

doku gibts unter http://www.mysql.com/doc/en/index.html

ansonsten poste doch mal deine mehr-schritte-lösung.
 

Disruptor

Turniere & LANs
Mitglied seit
03.08.2002
Beiträge
666
Reaktionen
0
select abs(timestampeins-timestampzwei), * order by 1 limit 0,1

oder so ähnlich

order by und eine aggregat-funktion macht so keinen sinn
und limit ist mysql-spezifisch
 

Sas~iN~LoVe

Guest
wendet er den min(...) kram nicht auf jeden ds an und sortiert das set dann nach dem resultat? so sollte das imo sein, dann würds gehen. und ja, limit hab ich aus der mysql-doku...
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
danke euch beiden..
ich werd das nachher mal ausprobieren wenn ich wieder zu hause an meinem eigenen rechner bin. ich wusste nicht, dass man die datums/zeitangaben einfach so voneinander subtrahieren kann.. wenn das geht, sollte die lösung ja nicht mehr allzu schwer sein..


Original geschrieben von Sas~iN~LoVe
ansonsten poste doch mal deine mehr-schritte-lösung.

bisher hab ich das programmiertechnisch gelöscht. hab mir einfach per select statement die komplette tabelle geholt und dann in ner schleife die zeile ermittelt, in der die differenz der datumsangaben am kleinsten ist.
war auch eigentlich kein problem und hat funktioniert, aber ich wollte es eben gern ein wenig einfacher und nur mit einer sql anweisung realisieren ;)
 

Sas~iN~LoVe

Guest
achso, ich dachte du hättest es bislang mit 2 datenbank-querries gemacht...

also das mit dem datetime sollte eigentlich nicht so das problem sein, wenn ich mysql implementiert hätte :ugly: würde so ein wert einfach als YYYYMMDDhhnnss gespeichert und dann passts ;)
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
hab das jetzt grad mal ausprobiert, und es funktioniert leider nicht, die beiden datumswerte einfach zu subtrahieren...

auf den ersten blick geht es zwar schon mal in die richtige richtung, allerdings gibt er beispielsweise als differenz von "2003-01-01 10:00:00" und "2003-01-01 10:01:01" nicht 61 zurück (was dann der anzahl der sekunden entsprechen würde) sondern 101. anscheinend subtrahiert er also die beiden daten stumpf von einander und es ist ihm ziemlich egal, dass eine minute 60 sekunden hat...

naja, ich werd noch mal n bisschen weiter rumprobieren.. ich denke mal die subtraktion könnte irgendwie klappen, nur vielleicht muss man ihm noch explizit sagen, dass es sich um daten handelt (obwohl er das doch eigentlich selbst können müsste oder)!?

naja, wenn noch jemand ne idee hat, würd ich mich freuen...

m.a.k.
 

Sas~iN~LoVe

Guest
aber das ist doch egal. du wolltest doch die kleinste differenz und die bekommst du so. dass der absolute wert natürlich nicht der differenz in minuten oder sonst einer zeiteinheit entspricht, ist ja klar...
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Original geschrieben von Sas~iN~LoVe
aber das ist doch egal. du wolltest doch die kleinste differenz und die bekommst du so. dass der absolute wert natürlich nicht der differenz in minuten oder sonst einer zeiteinheit entspricht, ist ja klar...

naja, ganz egal ist es nicht, aber dann scheinbar wohl nicht zu ändern...
ich hätte es am liebsten so gehabt, dass mir das sql statement genau die differenz der kleinsten differenz wiedergibt (in minuten, sekunden oder was auch immer). das hab ich oben in meiner eingangsfrage wohl ein bisschen falsch formuliert...

mit der methode von oben hab ich nämlich jetzt zwar die passende zeile in der tabelle, wo die kleinste differenz steht, muss aber immer noch händisch die beiden datumswerte auslesen und die differenz berechnen.
 

Sas~iN~LoVe

Guest
ja das schon, ist aber trotzdem performanter, da du ja nur noch einen datensatz ins lokale recordset lädst. besser gehts halt nicht ;)
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
naja. muss ich dann halt damit leben, dass ich doch noch ein bisschen was im code machen muss..
aber trotzdem nochmal danke für die hilfe... alleine hätte ich da wahrscheinlich noch bis morgen früh drangesessen ;)
 

The_Company

Guest
Original geschrieben von Sas~iN~LoVe
aber das ist doch egal. du wolltest doch die kleinste differenz und die bekommst du so. dass der absolute wert natürlich nicht der differenz in minuten oder sonst einer zeiteinheit entspricht, ist ja klar...
Denkste.
ABS ("10:00:00" - "10:00:59") => 59, und 59 Sekunden
ABS ("10:00:40" - "10:01:00") => 60(?), aber nur 20 Sekunden
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
probiert mal die zwei datetimes in nen timestamp zu converten oder zu schaun ob es nicht doch wo ne funktion kind'a datediff gibt


ps: sql standards gibts nen paar jeweils nach jahreszahl und selbst die grossen datenbanken unterstuezten bestimmte kern-funktionalitaeten nicht und haben teilweise nicht standardkonforme syntax
 

Disruptor

Turniere & LANs
Mitglied seit
03.08.2002
Beiträge
666
Reaktionen
0
probier mal die mysql-funktion unix_timestamp

select abs(unix_timestamp(datetimeeins)-unix_timestamp(datetimezwei)), * order by 1 limit 0,1


order by und aggregat-funktion macht nur im zusammenhang mit group by einen sinn:

select typ, min(x-y) group by typ order by 2
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Original geschrieben von Disruptor
probier mal die mysql-funktion unix_timestamp

select abs(unix_timestamp(datetimeeins)-unix_timestamp(datetimezwei)), * order by 1 limit 0,1


order by und aggregat-funktion macht nur im zusammenhang mit group by einen sinn:

select typ, min(x-y) group by typ order by 2

jep... das isses.. liefert mir fein die differenz in sekunden zurück..
thx...

nun taucht allerdings das nächste problem auf... du sagst das sei eine mysql funktion.. ich geh dann mal davon aus, dass es die unter oracle, informix und ms sql nicht gibt, oder?
kennt jemand für die anderen systeme eine vergleichbare funktion?
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
Original geschrieben von m.a.k.


jep... das isses.. liefert mir fein die differenz in sekunden zurück..
thx...

nun taucht allerdings das nächste problem auf... du sagst das sei eine mysql funktion.. ich geh dann mal davon aus, dass es die unter oracle, informix und ms sql nicht gibt, oder?
kennt jemand für die anderen systeme eine vergleichbare funktion?

brauchste das zeug denn auf ner anderen plattform. nach allem was ich bisher mitbekommen hab gibts genau drei moeglichkeiten ne db zu designen:

a, fuer jede db die queries neu schreiben (sprich dann auch im programmcode die queries als resources und o.ae. und nicht hardcoded einbaun damit du sie einfach austauschen kannst)
b, ne eigene datenbanklayer baun, in der du per code den aufbau einer query zusammenstellst und diese layer daraus ne db-spezifische anweisung macht (nachteile: schlecht optimierbar, derber aufwand wenn du es selbst machst, ohne guten plan landest du mit sicherheit irgendwo in einer designbegruendeten sackgasse und ausserdem ist sql querie zusammenstellen dann auch wesentlich aufwaendiger)
c, du probierst die db funktionalitaet in stored procedures zu verlagern und musst dann bei bedarf nichts am programmcode mehr aendern sondern lediglich die procedures (dafuer muss die db natuerlich stored procedures koennen ;) )

natuerlich kann man auch alternativ versuchen sich auf den kleinsten gemeinsamen nenner zu einigen, muss man halt auf so unwichtige ;) dinge wie TOP 10 oder LIMITs verzichten :elefant:
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
so hab mal nen versuch mit sql server gemacht:

SELECT ID, A, B, B-A AS diff FROM Try ORDER BY diff
Code:
1	1899-12-30 01:01:01.000	1899-12-30 01:01:01.000	1900-01-01 00:00:00.000
2	1899-12-30 02:01:01.000	1899-12-30 02:01:04.000	1900-01-01 00:00:03.000
3	1899-12-30 02:01:01.000	1899-12-30 02:01:15.000	1900-01-01 00:00:14.000
5	1899-12-30 08:09:50.000	1899-12-30 08:10:10.000	1900-01-01 00:00:20.000
4	1899-12-30 04:02:12.000	1899-12-30 04:02:40.000	1900-01-01 00:00:28.000
6	1899-12-30 10:09:00.000	1899-12-30 10:10:30.000	1900-01-01 00:01:30.000

beides datetime columns, keine probleme mit der umwandlung 10:30 - 9:00 => 1:30 wie es sich gehoert
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Original geschrieben von ViperDK
brauchste das zeug denn auf ner anderen plattform.

leider ja..
ich werde es folgendermaßen machen (deshalb wollte ich auch nach möglichkeit alles mit einer einzigen datenbankabfrage erledigen):
die sql statements werden einfach in eine datei geschrieben und mein proggi liest sie dann daraus ein.
jetzt muss ich nur noch für jedes große datenbanksystem eine solche datei schreiben (bzw. meine bisherige datei, die ich für mysql geschrieben habe anpassen), und das wars..


Original geschrieben von ViperDK
so hab mal nen versuch mit sql server gemacht:

SELECT ID, A, B, B-A AS diff FROM Try ORDER BY diff
Code:
1	1899-12-30 01:01:01.000	1899-12-30 01:01:01.000	1900-01-01 00:00:00.000
2	1899-12-30 02:01:01.000	1899-12-30 02:01:04.000	1900-01-01 00:00:03.000
3	1899-12-30 02:01:01.000	1899-12-30 02:01:15.000	1900-01-01 00:00:14.000
5	1899-12-30 08:09:50.000	1899-12-30 08:10:10.000	1900-01-01 00:00:20.000
4	1899-12-30 04:02:12.000	1899-12-30 04:02:40.000	1900-01-01 00:00:28.000
6	1899-12-30 10:09:00.000	1899-12-30 10:10:30.000	1900-01-01 00:01:30.000

beides datetime columns, keine probleme mit der umwandlung 10:30 - 9:00 => 1:30 wie es sich gehoert

thx
 
Oben