TP Underground Lounge 07/08
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 16.03.2004, 09:58   #1
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE

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
Stuck Mojo ist offline   Mit Zitat antworten


Alt 16.03.2004, 10:46   #2
TP-Special Mod
 
Benutzerbild von webmichl
 
Registriert seit: Jun 2001
Ort: 8°21' O 49°1' N
webmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine User
So aus dem Bauch raus und ungetestet ( php-Variante):

$Schnitt= min( $Ende1, $Ende2 ) - max($Start1, $Start2 ) + 1 ;
if ( $Schnitt > 0 ) { /* überschneidet sich */
webmichl ist offline   Mit Zitat antworten
Alt 16.03.2004, 10:49   #3
TP-Specialist
 
Benutzerbild von mike
 
Registriert seit: Jan 2002
Ort: TP/Dynamik
mike bringt sich richtig ein
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
mike ist offline   Mit Zitat antworten
Alt 16.03.2004, 11:08   #4
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
@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
Stuck Mojo ist offline   Mit Zitat antworten
Alt 16.03.2004, 11:19   #5
TP-Special Mod
 
Benutzerbild von webmichl
 
Registriert seit: Jun 2001
Ort: 8°21' O 49°1' N
webmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine Userwebmichl lebt für das TP und seine User
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?
webmichl ist offline   Mit Zitat antworten
Alt 16.03.2004, 11:35   #6
TP-Specialist
 
Benutzerbild von mike
 
Registriert seit: Jan 2002
Ort: TP/Dynamik
mike bringt sich richtig ein
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
mike ist offline   Mit Zitat antworten
Alt 16.03.2004, 12:00   #7
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
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
Stuck Mojo ist offline   Mit Zitat antworten
Alt 16.03.2004, 12:10   #8
TP-Specialist
 
Benutzerbild von mike
 
Registriert seit: Jan 2002
Ort: TP/Dynamik
mike bringt sich richtig ein
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.

Code:
      6 7 8
4 5 6 7
vorkommen könnte, würfelt es ihn auf.
Das macht dann Hr. michls lösung korrekt.
__________________
Gehelft? Hier kannst du dich bedanken.

mike
mike ist offline   Mit Zitat antworten
Alt 16.03.2004, 12:11   #9
TP-Specialist
 
Benutzerbild von mike
 
Registriert seit: Jan 2002
Ort: TP/Dynamik
mike bringt sich richtig ein
p.s. erledigt?!
__________________
Gehelft? Hier kannst du dich bedanken.

mike
mike ist offline   Mit Zitat antworten
Alt 16.03.2004, 12:14   #10
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
Zitat:
Original geschrieben von mike
p.s. erledigt?!
...pff hatte ich gerade gedürckt
Stuck Mojo ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
Mathefrage... Mathefrage...
« Klassen - Für was sind die alles gut? | Zähler für letzten Tag/Woche/Monat etc.? »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:51 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67