Autor Beitrag
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 15.05.08 12:41 
Ich benötige eine Möglichkeit die Differenz zwischen zwei Daten in Tagen heraus zu bekommen.

Mit Oracle kann ich einfach folgendes ausführen:
ausblenden SQL-Anweisung
1:
select to_date('05.01.2008''dd.mm.yyyy')-to_date('01.01.2008''dd.mm.yyyy'from dual					

Das liefert mir dann entsprechend 4 Tage.

Mit dem MSSQL-Server geht das dann wieder nicht, da bekomme ich dann als Ergebnis den 05.01.1900. Das Ergebnis wäre also der Abstand zwischen 01.01.1900 und dem Ergebnis der Subtraktion - hilft mir auch nichts.
Der MSSQL-Server bietet dann jedoch eine Funktion DATEDIFF an, welche jedoch kein SQL '92 ist und bei Oracle natürlich nicht existiert.

Das SQL muss aber nicht nur auf den beiden "großen" Datenbanken laufen, sondern zusätzlich auf MySQL, Interbase, Informix, etc. pp. und ich habe an der Stelle keine Möglichkeit zu sagen "wenn Oracle dann, wenn MSSQL dann, ...".

Ich habe schon überlegt mir einfach den Tag des Jahres zu holen und die dann voneinander abzuziehen, leider bieten hier Oracle, DB2 und MySQL die Funktion DAYOFTHEYEAR[1] an, während ich beim MSSQL Server mit DATEPART[2] arbeiten müsste.

Hat jemand 'ne Idee, wie ich das realisieren kann?

[1] www.tizag.com/sqlTutorial/sqldate.php
[2] www.tizag.com/sqlTutorial/sqldatepart.php
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 15.05.08 12:57 
user profile iconbaka0815 hat folgendes geschrieben:
Ich benötige eine Möglichkeit die Differenz zwischen zwei Daten in Tagen heraus zu bekommen.
Das SQL muss aber nicht nur auf den beiden "großen" Datenbanken laufen, sondern zusätzlich auf MySQL, Interbase, Informix, etc. pp. und ich habe an der Stelle keine Möglichkeit zu sagen "wenn Oracle dann, wenn MSSQL dann, ...".

Dann ist dein SW-Design falsch. Du solltest ein Bridge-Pattern verwenden, das Deine DB-Abfragen/Zugriffe etc. über eine einheitliche Schnittstelle nach außen darstellt. Danach schreibst Du für jedes DBMS eine eigene Klasse (abgeleitet von dieser Bridge) und implementierst dort die DBMS-typischen Dialekte und Performancetricks.

Die eierlegende Wollmilchsau für DBMS gibt es leider nicht. und was SQL anbelangt, kocht blöderweise jeder Hersteller sein eigenes Süppchen.

Falls 'CAST' ANSI-SQL ist und die interne Darstellung der Datumswerte auch geregelt ist, dann könntest Du mal probieren, zwei Datumse :mrgreen: in Floats zu casten und dann voneinander abzuziehen, also so etwa:

ausblenden SQL-Anweisung
1:
2:
select cast(cast ('20080513 13:15:00' as Datetime) as float) - 
       cast(cast ('20080519 12:00:00' as Datetime) as float)


Datetime wird intern als Float abgelegt, und es kann sein, das das eben per ANSI geregelt ist, weiss ich aber nicht.

_________________
Na denn, dann. Bis dann, denn.
baka0815 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 15.05.08 13:07 
user profile iconalzaimar hat folgendes geschrieben:
user profile iconbaka0815 hat folgendes geschrieben:
Ich benötige eine Möglichkeit die Differenz zwischen zwei Daten in Tagen heraus zu bekommen.
Das SQL muss aber nicht nur auf den beiden "großen" Datenbanken laufen, sondern zusätzlich auf MySQL, Interbase, Informix, etc. pp. und ich habe an der Stelle keine Möglichkeit zu sagen "wenn Oracle dann, wenn MSSQL dann, ...".

Dann ist dein SW-Design falsch. Du solltest ein Bridge-Pattern verwenden, das Deine DB-Abfragen/Zugriffe etc. über eine einheitliche Schnittstelle nach außen darstellt. Danach schreibst Du für jedes DBMS eine eigene Klasse (abgeleitet von dieser Bridge) und implementierst dort die DBMS-typischen Dialekte und Performancetricks.

In dem Fall hat das leider nichts mit Fehlkonzeption zu tun, es handelt sich um einen zu erstellenden Report und die SQLs werden direkt im Report hinterlegt, müssen somit also allgemeingültig sein. Verschiedene Reports für verschiedene DBMS sollen vermieden werden.
Was das Bridge-Pattern der SW angeht ist ein anderes Thema, aber da kennt man das Sprichwort mit den Windmühlen ja...

Zitat:
Die eierlegende Wollmilchsau für DBMS gibt es leider nicht. und was SQL anbelangt, kocht blöderweise jeder Hersteller sein eigenes Süppchen.

Wenn wenigstens alle SQL '92 unterstützen würden, wäre das auch schon bombig.
Unter'm MSSQL-Server werden Strings mit "+" verknüpft, in SQL '92 mit "||". Oracle sagt bei der Verwendung von "+" nur, dass es sich nicht um Zahlen handelt.
Wenn schon solche Operation nicht allgemeingültig geregelt sind... *seufz*

Zitat:
Falls 'CAST' ANSI-SQL ist und die interne Darstellung der Datumswerte auch geregelt ist, dann könntest Du mal probieren, zwei Datumse :mrgreen: in Floats zu casten und dann voneinander abzuziehen, also so etwa:

ausblenden SQL-Anweisung
1:
2:
select cast(cast ('20080513 13:15:00' as Datetime) as float) - 
       cast(cast ('20080519 12:00:00' as Datetime) as float)


Datetime wird intern als Float abgelegt, und es kann sein, das das eben per ANSI geregelt ist, weiss ich aber nicht.


CAST ist ANSI-SQL und funktioniert sowohl unter Oracle als auch unter MSSQL. Wie das mit den anderen DBs aussieht, weiß ich leider nicht, da ich hier keine Test-DBs habe.
Der Ansatz mit CAST kam mir auch schon, ein Datum jedoch einfach in einen Float umzuwandeln - daran habe ich nicht gedacht. Funktioniert auf jeden Fall unter MSSQL und ich werd' das jetzt einfach mal so einbauen. Mal gucken, was die anderen DBMSs dazu sagen ;)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 15.05.08 13:12 
Ich umgehe dieses Problem entweder mit Bridges oder verlagere das Problem ins DBMS, indem ich für die Reports dann auf dem Ziel-DBMS eine View erstelle (die dann wieder lokale SQL-Befindlichkeiten berücksichtigen kann)

Im Report wird dann einfach diese View (ggf mit Filtern) aufgerufen.

_________________
Na denn, dann. Bis dann, denn.
Jetstream
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Do 15.05.08 18:09 
Wenn es dir reicht, die Differenz außerhalb von SQL zu berechnen, bekommst du zB folgendermaßen Jahr, Monat, Tag, Stunde, Minute und Sekunde aus der Datetime:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
SELECT
            DATEPART(  year,    meindatum) AS year,
            DATEPART(  month,    meindatum) AS month,
            DATEPART(  day,    meindatum) AS day,
            DATEPART(  hour,    meindatum) AS hour,
            DATEPART(  minute,    meindatum) AS minute,
            DATEPART(  second,    meindatum) AS second
          FROM
            tabelle


MSSQL ist da ziemlich eigen.

_________________
Die folgenden Klangbeispiele sind Ergänzungen zum methodischen Aufbau der Textbeilage und dürfen nicht losgelöst von dieser behandelt werden.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 15.05.08 18:32 
Es soll für -wenns geht- alle(!) RDBMS eine Lösung gefunden werden.

_________________
Na denn, dann. Bis dann, denn.
baka0815 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 29.05.08 09:13 
user profile iconJetstream hat folgendes geschrieben:
Wenn es dir reicht, die Differenz außerhalb von SQL zu berechnen, bekommst du zB folgendermaßen Jahr, Monat, Tag, Stunde, Minute und Sekunde aus der Datetime:[...]

Wie alzaimer schon sagte, brauche ich eine Lösung für alle (oder zumindest möglichst viele) RDBMs, wenigstens aber MSSQL und Oracle.

Wie in meinem ersten Posting geschrieben, kenne ich die Funktion DATEPART, aber das hilft mir halt leider nichts...
user profile iconbaka0815 hat folgendes geschrieben:
Ich habe schon überlegt mir einfach den Tag des Jahres zu holen und die dann voneinander abzuziehen, leider bieten hier Oracle, DB2 und MySQL die Funktion DAYOFTHEYEAR[1] an, während ich beim MSSQL Server mit DATEPART[2] arbeiten müsste.

Naja, mit dem CAST auf FLOAT geht's ja erstmal, nur MySQL 4.x kann das glaube ich nicht *seufz*
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 29.05.08 10:40 
Nochmal (Zeig das deinem Projektleiter/Vorgesetzten/Chef):

Es gibt keine allgemeingültige SQL-Syntax, das auch kompliziertere Reports auf allen DBMS ermöglicht

_________________
Na denn, dann. Bis dann, denn.
baka0815 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 29.05.08 16:29 
user profile iconalzaimar hat folgendes geschrieben:
Nochmal (Zeig das deinem Projektleiter/Vorgesetzten/Chef):

Es gibt keine allgemeingültige SQL-Syntax, das auch kompliziertere Reports auf allen DBMS ermöglicht

Das Problem ist, dass es diese allgemeingültige SQL-Syntax theoretisch gibt, nennt sich SQL'92, SQL'99 (SQL2) und SQL 2003 (SQL3) - nur hält sich kaum einer an diese "Standards" (ein Standard an den sich keiner hält, ist de facto keiner)...
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 29.05.08 16:34 
Eben.

_________________
Na denn, dann. Bis dann, denn.