Sortierung bei Zeitintervalen

DrJeykyll

Mitglied
Ich habe eine DBTabelle in der Zeitintervale aufgelistet sind. z.b
1 week
2 weeks
1 day
2 days
1 month

wi kann ich die sinnvoll ordnen
also am besten tag.. woche... monat
 
Hi,

ich würde die Angaben alle in Tage umrechnen. Dazu musst Du sie halt umständlich über die String-Funktionen auseinanderpflücken und dann je nach Einheit die Zahl mit 1, 7, oder 30 multiplizieren:

SQL:
LEFT(intervall, LOCATE(' ', intervall) - 1) * 
   CASE RIGHT(intervall, LENGTH(intervall) - LOCATE(' ', intervall)) 
      WHEN 'day' THEN 1 
      WHEN 'days' THEN 1 
      WHEN 'week' THEN 7 
      WHEN 'weeks' THEN 7 
      WHEN 'month' THEN 30 
      WHEN 'months' THEN 30 
      ELSE 0 
   END

Schön sieht anders aus... ;)

LG
 
Hallo,
ich habe das jetzt so verstanden das Du in EINER Spalte die intervalle und die Anzahl zu stehen hast.

Außerdem mach ich es mal für MySql (Du hast leider nicht gesagt für welches DBMS ;-) )

Dann könnte man das so hier machen:

Tabelleninhalt
--------------------
SQL:
id;		in_value
1;		1 week
2;		2 weeks
3;		1 day
4;		2 days
5;		1 month

Und dazu das/die query:
-----------------------------------
SQL:
select splitter.*, counter * case determiner when 'day' then 24  
																 when 'days'then 24 
																 when 'week' then 24*7 
																 when 'weeks' then 24*7
																 when 'month' then 24*30
end hours 
from 
(

			select in_value, substring(in_value,1,instr(in_value , " ")-1) counter
     								 , substring(in_value, instr(in_value , " ")+1)  determiner 
			from t_interval_test order by in_value
)splitter
order by hours

Und der sortierte output:
----------------------------------
SQL:
in_value;		counter;		determiner;		hours
1 day;		1;		day;		24
2 days;		2;		days;		48
1 week;		1;		week;		168
2 weeks;		2;		weeks;		336
1 month;		1;		month;		720

Das gesamte wird bei dem Monat etwas ungenau, da ich hier nur 30 Tage für den Monat nehme.

Eventuell hilft Dir das?

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Hi,

sehe gerade das "kuddeldaddeldu" genau im gleichen Moment geantwortet hat ;)

Es ist im Übrigen wirklich nicht schön einen interval-typ und dessen anzahl in EINER Spalte abzulegen.

Viele Grüß
 
Hi,

man braucht da jetzt übrigens auch keine Unterabfrage (in MySQL). Wenn man die Anzahl Tage, Stunden oder was auch immer nicht als Spalte im Ergebnis haben will, kann man die Berechung auch direkt in der ORDER BY Klausel verwenden.

LG
 
Danke ihr habt mir sehr geholfen.

In diesem Fall wäre es ja dann aber auch egal ob ich jetzt
*30
oder *20
rechne...

Da man da ja in einem andern Interval rechnet.
Also es gibt ja z.B keine auswahl 29 Tage sondern entweder
4 Wochen oder 1 Monat...

Versteht das jemand so wie ich das jetzt zu erklären versucht habe...
 
Hi,

In diesem Fall wäre es ja dann aber auch egal ob ich jetzt
*30
oder *20
rechne...

Da man da ja in einem andern Interval rechnet.
Also es gibt ja z.B keine auswahl 29 Tage sondern entweder
4 Wochen oder 1 Monat...

Wenn Du die Monate nur mit 20 multiplizierst, wären in dieser Relation aber 4 und selbst 3 Wochen länger als ein Monat... ;)
Nimm 30 Tage für einen Monat und Du bist auf der sicheren Seite.

LG
 
Zurück