 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
16.03.2004, 09:58
|
#1
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
Mathefrage...
Hi !!
Ich suche nach einer mathematischen Lösung für folgendes Problem:
Ich habe 2 Zeiträume (Monate von-bis), mit jeweils einem Anfangs- und Endwert. Legt man diese beiden Zeiträume übereinander können diese sich an bestimmten Monaten schneiden (oder auch nicht). Ich benötige die Anzahl der Überschneidungen.
Bsp:
Code:
Wert 1: 1, 4
Wert 2: 3, 6
1 2 3 4
3 4 5 6
= 2 Überschneidungen
Wert 1: 2, 10
Wert 2: 3, 6
2 3 4 5 6 7 8 9 10
3 4 5 6
= 4 Überschneidungen
Hat wer eine Idee, wie man das mathematisch lösen kann? Ich benötige das in einer Datenbankabfrage - daher suche ich nach einer mathematischen Lösung. Bisher nutze ich eine eigene Funktion (MSSQL), die den Kram über eine temporäre Tabelle regelt... Ist aber definitiv zu performance-lastig...
Danke und Gruss
Jan
|
|
|
16.03.2004, 10:46
|
#2
|
|
TP-Special Mod
Registriert seit: Jun 2001
Ort: 8°21' O 49°1' N
|
So aus dem Bauch raus und ungetestet ( php-Variante):
$Schnitt= min( $Ende1, $Ende2 ) - max($Start1, $Start2 ) + 1 ;
if ( $Schnitt > 0 ) { /* überschneidet sich */
|
|
|
16.03.2004, 10:49
|
#3
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
vielleicht denke ich da ein wenig zu simpel, aber mit einer udf lässt sich das ganze relativ einfach realisieren:
CREATE FUNCTION dbo.test(@ende1 int, @start2 int)
RETURNS int
AS
BEGIN
return @start2 - @ende1 + 1
END
in deinem Fall:
1. select dbo.test(3,4)
2. select dbo.test(3,6)
vorraussetzung wäre halt, dass ende1 und start2 vorher geprüft werden, ob ende1 > start2
denke aber, dass man das dann auch noch in die Funktion reinpatzen könnte.
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
16.03.2004, 11:08
|
#4
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
@michl: Leider ist es nicht so einfach... mit deiner Funktion hab ich kein einziges korrektes Ergebniss bekommen.
@mike: Ich brauche doch 4 Parameter? Oder bin ich einfach nur blind?
Das hier hab ich z.Z. ...das Funktioniert auch super:
Code:
CREATE FUNCTION bk_matchPeriods (@p1_start int, @p1_end int, @p2_start int, @p2_end int)
RETURNS decimal(18,5)
AS
BEGIN
DECLARE @P2length int, @c int, @match int
SET @P2length = @p2_end+1-@p2_start
SET @c = 0
DECLARE @sTable TABLE (sMonth int primary key)
while(@p1_start <= @p1_end)
BEGIN
INSERT INTO @sTable VALUES (@p1_start)
SET @p1_start = @p1_start + 1
END
while(@p2_start <= @p2_end)
BEGIN
SET @match = (SELECT sMonth FROM @sTable WHERE sMonth = @p2_start)
IF @match IS NOT NULL
SET @c = @c + 1
SET @p2_start = @p2_start + 1
END
--RETURN @c
RETURN CAST(@c AS decimal(18,5))/ CAST(@P2length AS decimal(18,5))
END
Dei Funktion gibt allerdings nicht nur die Anzahl an Überschneidungen zurück, sondern auch den Faktor der Überschneidung. Der Zähle ist @c.
Gruss
Jan
|
|
|
16.03.2004, 11:19
|
#5
|
|
TP-Special Mod
Registriert seit: Jun 2001
Ort: 8°21' O 49°1' N
|
Zitat:
Original geschrieben von Stuck Mojo
@michl: Leider ist es nicht so einfach... mit deiner Funktion hab ich kein einziges korrektes Ergebniss bekommen. 
|
Dein 1. Beispiel:
1 2 3 4
3 4 5 6
min(Ende1,Ende2) wäre 4
max(Start1,Start2) wäre 3
4-3+1 = 2
Dein 2. Beispiel:
2 3 4 5 6 7 8 9 10
3 4 5 6
min(Ende1,Ende2) wäre 6
max(Start1,Start2) wäre 3
6-3+1 = 4
von der Logik her passt's doch?
|
|
|
16.03.2004, 11:35
|
#6
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
nimm dein eigenes beispiel her:
2 3 4 5 6 7 8 9 10
3 4 5 6
so brauchst du nur zu wissen wo die seqzenz anfängt und aufhört = zwei Parameter
dann einmal Volksschule, indem ich die differenz zwischen den beiden zahlen ausrechne und +1 dazu damit der 'offset' auch noch hinhaut.
also
6 - 3 + 1 = 4 übereinstimmungen
problem wäre sowas:
1 2 3
5 6 7
hier müsste dann halt noch ein check hin, dass ende1 > anfang2 ist ansonsten return 0
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
16.03.2004, 12:00
|
#7
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
UPS! Michls Lösung funzt ja DOCH!  ...hab da irgendwo nen Fehler drin gehabt
Hier das fertige Teil:
Code:
CREATE FUNCTION bk_matchPeriods (@p1_start int, @p1_end int, @p2_start int, @p2_end int)
RETURNS decimal(18,5)
AS
BEGIN
DECLARE @P2length int, @c int
SET @P2length = @p2_end+1-@p2_start
DECLARE @min int
DECLARE @max int
SET @min = CASE WHEN @p1_end < @p2_end THEN @p1_end ELSE @p2_end END
SET @max = CASE WHEN @p1_start > @p2_start THEN @p1_start ELSE @p2_start END
SET @c = @min - @max +1
IF @c < 0
SET @c = 0
return CAST(@c AS decimal(18,5))/ CAST(@P2length AS decimal(18,5))
END
Die Idee von Mike ist doch jetzt die gleiche wie von Michl... die 2 Werte müssen aber noch unterschieden werden mit dem min und max... Aber um ehrlich zu sein, hab ich jetzt keinen Nerv mehr weiter drüber nachzudenken  Ich danke euch beiden!
Gruss
Jan
|
|
|
16.03.2004, 12:10
|
#8
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
fein dass es hinhaut,
ich verbessere mich trotzdem:
Code:
CREATE FUNCTION dbo.test(@ende1 int, @start2 int)
RETURNS int
AS
BEGIN
if (@start2 > @ende1)
return 0
return @ende1 - @start2 + 1
END
hatte die Berechnung verdreht!
einzig der fall wenn z.b.
vorkommen könnte, würfelt es ihn auf.
Das macht dann Hr. michls lösung korrekt.
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
16.03.2004, 12:11
|
#9
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
p.s. erledigt?! 
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
16.03.2004, 12:14
|
#10
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
Zitat:
Original geschrieben von mike
p.s. erledigt?!
|
...pff  hatte ich gerade gedürckt 
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 10:51 Uhr.
|
 |