von F3K Total » Fr, 23.09.2016 18:30
Hallo janbah,
deine Frage hat meinen Ehrgeiz geweckt. Da ich aus eigenen Pojekten weiß, das die Funktion
DATEDIFF viel Rechenleistung in Anspruch nimmt, und man sie hier eigentlich nur deshalb einsetzt, weil die
HSQL 1.8.10 die Funktion
DATEADD nicht unterstützt, habe ich mir etwas anderes ausgedacht:
- In der simplen Tabelle T_Z stehen Zahlen von 1 bis 31.
- Die Abfrage q_Kalender kann jetzt benutzt werden, um jeglichen Kalender zu erzeugen, ich habe durch die Bedingungen
Code: Alles auswählen
M.Z = MONTH(CURRENT_DATE)
AND
D.Z = CASEWHEN(DAY(CURRENT_DATE)=29,28,DAY(CURRENT_DATE))
das Abfrageergebnis von q_Kalender auf den Tag vor einem Jahr, also genau eine Zeile beschränkt.
- Dieses Datum benutze ich nun in der Abfrage q_letztesJahr_F3K um die Daten des letzten Jahres zu filtern, kein DATEDIFF !
- In der letzten Abfrage q_mtl_Übersicht_F3K findest du das Ergebnis, vergleichbar mit deinem, nur leere Zeilen fehlen.
Dieses Vorgehen führt auf meinem Rechner zu einer Reduzierung der Ausführungsdauer auf etwa
20% der Dauer deiner Abfrage (3,5/17 Sekunden).
Anbei die Datei.
Gruß R
EDIT: Habe die Datei noch einmal getauscht, es war ein Fehler in
qKalender
EDIT2: Wenn man die Abfrage
qKalender durch folgenden Code ersetzt, kann man auf die Tabelle
T_Z verzichten
Code: Alles auswählen
SELECT
CAST(
CASE
WHEN ( DAY( CURRENT_DATE ) = 29 AND MONTH( CURRENT_DATE ) = 2 )
THEN '' || YEAR( CURRENT_DATE ) - 1 || '-02-28'
ELSE '' || YEAR( CURRENT_DATE ) - 1 || RIGHT( TO_CHAR( CURRENT_DATE, 'YYYY-MM-DD' ), 6 )
END
AS DATE ) "Datum"
FROM
"INFORMATION_SCHEMA"."SYSTEM_TABLES"
WHERE
"TABLE_NAME" = 'SYSTEM_VIEWS'
EDIT3: Habe noch eine einfachere Abfrage für das Datum vor einem Jahr gefunden, ein 29. Februar wird zum 1. März:
Code: Alles auswählen
SELECT
CAST(
REPLACE(CURRENT_DATE, YEAR(CURRENT_DATE), YEAR(CURRENT_DATE)-1)
AS DATE) AS "Datum"
FROM
INFORMATION_SCHEMA.SYSTEM_TABLES
WHERE
TABLE_NAME = 'SYSTEM_VIEWS'
Hallo janbah,
deine Frage hat meinen Ehrgeiz geweckt. Da ich aus eigenen Pojekten weiß, das die Funktion [color=#0040FF][b]DATEDIFF[/b][/color] viel Rechenleistung in Anspruch nimmt, und man sie hier eigentlich nur deshalb einsetzt, weil die [color=#0040FF][b]HSQL 1.8.10[/b][/color] die Funktion [color=#0040FF][b]DATEADD[/b][/color] nicht unterstützt, habe ich mir etwas anderes ausgedacht:
[list][*]In der simplen Tabelle [color=#0040FF][b]T_Z[/b][/color] stehen Zahlen von 1 bis 31.
[*]Die Abfrage [color=#0040FF][b]q_Kalender[/b][/color] kann jetzt benutzt werden, um jeglichen Kalender zu erzeugen, ich habe durch die Bedingungen [code] M.Z = MONTH(CURRENT_DATE)
AND
D.Z = CASEWHEN(DAY(CURRENT_DATE)=29,28,DAY(CURRENT_DATE))[/code] das Abfrageergebnis von [color=#0040FF][b]q_Kalender[/b][/color] auf den Tag vor einem Jahr, also genau eine Zeile beschränkt.
[*]Dieses Datum benutze ich nun in der Abfrage [color=#0040FF][b]q_letztesJahr_F3K[/b][/color] um die Daten des letzten Jahres zu filtern, [color=#FF0000][b]kein DATEDIFF ![/b][/color]
[*]In der letzten Abfrage [color=#0040FF][b]q_mtl_Übersicht_F3K[/b][/color] findest du das Ergebnis, vergleichbar mit deinem, nur leere Zeilen fehlen.[/list]Dieses Vorgehen führt auf meinem Rechner zu einer Reduzierung der Ausführungsdauer auf etwa [color=#00BF40][size=150][b]20%[/b][/size][/color] der Dauer deiner Abfrage (3,5/17 Sekunden).
Anbei die Datei.[attachment=1]Projektplanung.odb[/attachment]
Gruß R
[color=#FF0000][b]EDIT: [/b][/color]Habe die Datei noch einmal getauscht, es war ein Fehler in [color=#0040FF][b]qKalender[/b][/color]
[color=#FF0000][b]EDIT2: [/b][/color]Wenn man die Abfrage [color=#0040FF][b]qKalender[/b][/color] durch folgenden Code ersetzt, kann man auf die Tabelle [color=#0040FF][b]T_Z[/b][/color] verzichten[code]SELECT
CAST(
CASE
WHEN ( DAY( CURRENT_DATE ) = 29 AND MONTH( CURRENT_DATE ) = 2 )
THEN '' || YEAR( CURRENT_DATE ) - 1 || '-02-28'
ELSE '' || YEAR( CURRENT_DATE ) - 1 || RIGHT( TO_CHAR( CURRENT_DATE, 'YYYY-MM-DD' ), 6 )
END
AS DATE ) "Datum"
FROM
"INFORMATION_SCHEMA"."SYSTEM_TABLES"
WHERE
"TABLE_NAME" = 'SYSTEM_VIEWS'[/code][attachment=0]Projektplanung2.odb[/attachment]
[color=#FF0000][b]EDIT3: [/b][/color]Habe noch eine einfachere Abfrage für das Datum vor einem Jahr gefunden, ein 29. Februar wird zum 1. März:
[code]SELECT
CAST(
REPLACE(CURRENT_DATE, YEAR(CURRENT_DATE), YEAR(CURRENT_DATE)-1)
AS DATE) AS "Datum"
FROM
INFORMATION_SCHEMA.SYSTEM_TABLES
WHERE
TABLE_NAME = 'SYSTEM_VIEWS'[/code]