Laden...

Zeitdifferenz zwischen zwei versch. Datums

Erstellt von The_Mexican vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.027 Views
The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren
Zeitdifferenz zwischen zwei versch. Datums

verwendetes Datenbanksystem: SQL Server 2005

Hi,
habe folgendes select mit dem zugehörigen output:


SELECT *
FROM tbl
WHERE IDName LIKE 'XX'
ORDER BY datCreated;

______________________________________________________________________________________
PrimaryKey|IDName|IDOrt|datCreated             |Dauer des Aufenthalts                 |
__________|______|_____|_______________________|______________________________________|
000001    |XX    |A    |2000-01-01 13:56:42.000|datCreated 000001 - datCreated 000002 |
000002    |XX    |B    |2000-02-16 08:13:15.000|datCreated 000002 - datCreated 000003 |	
000003    |XX    |C    |2000-03-18 14:13:58.000|datCreated 000003 - datCreated 000004 |	
000004    |XX    |A    |2000-04-22 12:33:17.000|????                                  |	

meine frage bezieht sich auf das erstellen des Ergebnisses der Spalte "Dauer des Aufenthalts"

kann mir jemand auf die sprünge geben oder einen ansatz (muss nicht gleich die komplette lösung sein) wie ich das entsprechende ergebnis von
datum aktueller datensatz - datum direkter nachfolger datensatz
erhalte?

ich weiß es gibt die DATEDIFF() Funktion aber mein problem ist es, beim endwert den direkten nachfolger zu bekommen.

wie gesagt es muss keine komplette lösung sein 😉 ein hinweis oder denkanstoss tut auch gut 😉

saludos
mex

que? como? no entiendo!!!!!

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

habs nicht getestet aber so in der Art


SELECT PrimaryKey, IDName, IDOrt, (
                            SELECT DATEDIFF(...)
                            FROM Tabelle AS t2
                            WHERE t2.dateCreated <= t1.dateCrated
                            ) AS DauerAufenthalt
FROM Tabelle AS t1
ORDER BY t1.dateCreated


Also per Unterabfrage.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

1.564 Beiträge seit 2007
vor 14 Jahren

Ist jetzt Zufall, aber wie bereits in dem anderen Thread ist hier ebenfalls ROW_NUMBER die Lösung. Ich schätze mal die Differenz soll abhängig von IDName ermittelt werden.

Versuch mal das hier:


; WITH cte (IDName, IDOrt, datCreated, RowNum) AS
(
   SELECT
      IDName,
      IDOrt,
      datCreated,
      ROW_NUMBER() OVER (PARTITION BY IDName ORDER BY datCreated ASC)
   FROM tbl
)
SELECT
      IDName,
      IDOrt,
      DATEDIFF(DAY, t2.datCreated, t1.datCreated)
   FROM cte t1
      JOIN cte t2 ON t1.IDName = t2.IDName AND t1.RowNum = t2.RowNum + 1
   WHERE RowNum = 1

@gfoidl:
Schätze war ein Schreibfehler, aber die Subquery muss mit MAX arbeiten und darf nicht "≤" als JOIN Kriterium verwenden da sonst immer der Wert von außen verwendet wird. Die Subquery sollte wohl wie folgt aussehen:


SELECT DATEDIFF(DAY, t1.datCreated, MAX(t2.datCreated))
FROM Tabelle AS t2
WHERE t2.dateCreated < t1.dateCrated

Problem ist aber dass das extrem auf die Performance geht. Zum einen weil es eh schon eine Inline-Subquery ist, zum ist das aber ein dreieckiger JOIN der einem Aufwand von ca. O(n^2) entspricht.

Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren

moin,

danke für die antworten 😉
die erste mit der subquery hab ich versucht - und ich muss leider sagen, ich hab es nicht zum laufen gebracht.


select t1.PrimaryKey, t1.IDName, t1.IDOrt, t1.datCreated,
	(select DATEDIFF(day, t2.datCreated, MAX(t1.datCreated))
	from tbl... AS t2
	where t1.datCreated < t2.datCreated)
	AS DauerAufenthalt
from tbl... AS t1
where t1.IDName LIKE 'XX'
ORDER BY t1.datCreated;

Msg 8120, Level 16, State 1, Line 1
Column 'tblxxx.PrimaryKey' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

das ein ausschnitt aus der fehlermeldung 😉

ich werde mich jetzt an dem nächsten vorschlag versuchen

  • über nacht ist mir noch was eingefallen... aber keine sorge, ich komm wieder keine frage 😉

salduos mex

que? como? no entiendo!!!!!

1.696 Beiträge seit 2006
vor 14 Jahren

Hallo,

wenn du die Fehlermeldung postest, bitte auch die dazugehörige Query, sonst muss man wieder rumraten.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren

so die zweite möglichkeit mit dem rowcount ausprobiert.

die view funktioniert,
das select funktioniert,

ABER:
das Ergebnis das angezeigt werden soll bleibt aus. die query wird erfolgreich ausgeführt, aber es erscheint kein inhalt

hmmm,
das hab ich wohl auch verzockt. dennoch danke 😦

und jetzt auf zu versuch drei

saludos

ps: fehlermeldung hab ich gepostet

que? como? no entiendo!!!!!

1.696 Beiträge seit 2006
vor 14 Jahren

Wie gesagt, ohne dein akt. Query kann man nicht viel helfen.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren

Wie gesagt, ohne dein akt. Query kann man nicht viel helfen.

so, aber jetzt.... s.h. oben... war mit dem kopf anscheinend woanderst

akt. query s.h. oben

que? como? no entiendo!!!!!

3.511 Beiträge seit 2005
vor 14 Jahren

Du benutzt die Aggregatfunktion MAX. Solche Funktionen benötigen immer ein GROUP BY. Dieses fehlt in deinem Inner-Select.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

1.564 Beiträge seit 2007
vor 14 Jahren

War noch ein Fehler in meinem Statement. Ich habe mir jetzt selber mal Testdaten zusammen geklopft...

Versuch das mal:


DECLARE @tbl TABLE (IDName INT, IDOrt INT, datCreated DATETIME)

INSERT INTO @tbl
             SELECT 1, 1, '2009-06-01'
   UNION ALL SELECT 1, 1, '2009-06-02'
   UNION ALL SELECT 1, 2, '2009-06-04'
   UNION ALL SELECT 1, 2, '2009-06-06'
   UNION ALL SELECT 2, 1, '2009-06-10'
   UNION ALL SELECT 2, 1, '2009-06-13'
   UNION ALL SELECT 2, 2, '2009-06-16'

; WITH cte (IDName, IDOrt, datCreated, RowNum) AS
(
   SELECT
      IDName,
      IDOrt,
      datCreated,
      ROW_NUMBER() OVER (PARTITION BY IDName ORDER BY datCreated)
   FROM @tbl
)
SELECT
      t1.IDName,
      t1.IDOrt,
      t2.datCreated [Von],
      t1.datCreated [Bis],
      DATEDIFF(DAY, t2.datCreated, t1.datCreated)
   FROM cte t1
      LEFT JOIN cte t2 ON t1.IDName = t2.IDName AND t1.RowNum = t2.RowNum + 1

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.