Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: SQL Server: Performance von DATEADD ist ne katastrophe

  Alt 23. Okt 2008, 23:54
Ich bin nicht sicher, ob ich deine Beschreibung richtig verstanden habe. Trotzdem versuche ich mal einen Vorschlag zu machen. Vielleicht bringt er dich ja auf einen anderen Ansatz...

Tabellenstruktur...
SQL-Code:
CREATE TABLE [Daten] (
   [id] [int] NOT NULL ,
   [parent_id] [int] NULL ,
   [Datum] [datetime] NULL ,
   CONSTRAINT [PK_Daten] PRIMARY KEY CLUSTERED
   (
      [id]
   ) ON [PRIMARY] ,
   CONSTRAINT [FK_Daten_Daten] FOREIGN KEY
   (
      [parent_id]
   ) REFERENCES [Daten] (
      [id]
   )
) ON [PRIMARY]
Tabelleninhalt...
Code:
id  parent_id   datum
1    NULL        21.10.2000
2    1            NULL
3    2            NULL
4    NULL        01.01.2008
5    4            NULL
6    3            30.11.2000
Abfrage...
SQL-Code:
DECLARE @id INT
SET @id = NULL -- NULL = alle letzten Datensätze
               -- Zahl = Nur den ausgewählten Datensatz

DECLARE @IDS TABLE (id INT PRIMARY KEY, parent_id INT, Datum1 DATETIME, Datum2 DATETIME)
DECLARE @Done BIT

SET @Done = 0

INSERT @IDS(id, parent_id, Datum1, Datum2)
SELECT id, parent_id, NULL, Datum
FROM daten x
WHERE ( NOT EXISTS (SELECT *
                      FROM daten
                      WHERE parent_id = x.id)
       AND @id IS NULL)
  OR (id = @id AND @id IS NOT NULL)

IF @@ROWCOUNT = 0 SET @Done = 1
WHILE @Done = 0 BEGIN

  UPDATE @IDS
  SET parent_id = d.parent_id,
      datum1 = d.datum
  FROM @IDS ids
  INNER JOIN daten d
    ON ids.parent_id = d.id
  WHERE ids.datum1 IS NULL
    AND ids.parent_id IS NOT NULL

  IF @@ROWCOUNT = 0 SET @Done = 1
END

SELECT id, datum1, datum2,
       COALESCE(DATEDIFF(dd, datum1, datum2), 0) tage,
       COALESCE(DATEDIFF(wk, datum1, datum2), 0) wochen,
       COALESCE(DATEDIFF(mm, datum1, datum2), 0) monate,
       COALESCE(DATEDIFF(yy, datum1, datum2), 0) jahre
FROM @IDS
Vielleicht kannst du ja auch nochmal genauer und mit Beispieldaten zeigen was du hast und was du benötigst.
  Mit Zitat antworten Zitat