• 18.07.2025, 19:03
  • Register
  • Login
  • You are not logged in.

 

miami flashback

Full Member

MYSQL - Differenz aus %Deadline% und Now() berechnen.

Saturday, October 31st 2009, 1:27am

Moin allerseits - häng gerade vor nem echt ätzendem (trivialen?) problem.

ich habe eine tabelle und muss diese so sortieren, das die kleinste differenz zwischen 2 datumsangaben oben steht.
trigger schon versucht, kriegs aber ums verrecken nicht hin, häng jetzt knapp 2 stunden hinter der mysql-doku :(

hilfe!

Y0Gi

God

Saturday, October 31st 2009, 12:59pm

Mal geraten und ungetestet:

Source code

1
2
3
SELECT feld, nochnfeld, TIMEDIFF(datum1, datum2) AS diff
FROM netabelle
ORDER BY diff;


So hat's eine zusätzliche Spalte im Ergebnis, sollte aber das kleinste Problem darstellen. Evtl. kannst du den SELECT-Ausdruck für die Spalte auch als Argument zu "ORDER BY" übergeben, aber da bin ich nicht sicher, ob das so funktioniert:

Source code

1
2
3
SELECT feld, nochnfeld
FROM netabelle
ORDER BY TIMEDIFF(datum1, datum2);

miami flashback

Full Member

Saturday, October 31st 2009, 5:55pm

danke yogi, hat geklappt! :) auch das untere beispiel funzte mit aktuellem(naja, debian halt^^) mysqlserver.

//edit: doch nicht - das klappt nur tagesweise.

SELECT Name,Deadline, Start, (Deadline+0) - (NOW()+0) AS diff
FROM Flugtafel
ORDER BY diff;

scheint das richtige ergebnis auszuwerfen.

This post has been edited 2 times, last edit by "miami flashback" (Oct 31st 2009, 9:20pm)

Y0Gi

God

Sunday, November 1st 2009, 10:17am

Ups, stimmt, das hatte ich nicht berücksichtigt. `DATEDIFF()` würde dagegen nur die Tage ohne Uhrzeit heran ziehen. Ein `DATETIMEDIFF()` gibt es offenbar nicht.

Das lässt sich dennoch nutzen, denke ich:

Source code

1
ORDER BY DATEDIFF(Deadline, Start), TIMEDIFF(Deadline, Start);


Kompakter und ohne redundante Feldnennung dürfte dieses sein:

Source code

1
ORDER BY TIMESTAMPDIFF(SECOND, Deadline, Start);

Je nach Genauigkeitsbedarf auch `FRAC_SECOND` statt `SECOND`.

Eine Idee wäre sonst noch, die beiden Felder als Timestamps zu behandeln, dann könnte man sie einfach subtrahieren. Eine passende Umwandlungsfunktion habe ich aber noch nicht gefunden und die Felder selbst sind vermutlich keine `TIMESTAMP`s, sondern `DATETIME`s.

In deinem Beispiel beziehst du allerdings nur das Feld `Deadline` mit ein, `Start` aber nicht?

miami flashback

Full Member

Monday, November 2nd 2009, 1:19pm

der name 'start' war leider etwas unglücklich ausgedrückt - die ursprüngliche sql-syntax war wesentlich länger, habe sie einfach sehr gekürzt, ums lesbarer zu machen.
im augenblick ist noch meine order-by-klausel aktiv, wenn ich das nächste mal dran sitze, werde ich mal deine version mit date/timediff testen :)