Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
Delphi 7 Enterprise
|
Re: SQL Server: Performance von DATEADD ist ne katastrophe
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.
|
|
Zitat
|