Autor |
Beitrag |
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: 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:
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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 15.05.08 12:57
baka0815 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  in Floats zu casten und dann voneinander abzuziehen, also so etwa:
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 
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 15.05.08 13:07
alzaimar hat folgendes geschrieben: | baka0815 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 in Floats zu casten und dann voneinander abzuziehen, also so etwa:
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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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
      
Beiträge: 222
|
Verfasst: 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:
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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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 
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 29.05.08 09:13
Jetstream 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...
baka0815 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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 
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 29.05.08 16:29
alzaimar 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 29.05.08 16:34
Eben.
_________________ Na denn, dann. Bis dann, denn.
|
|
|