MSSql Abfrage erstellen (Speziell)

Du meinst

WHERE ([Beginn] >= @Date) AND ([Ende] <= @Date)

Geht auch nicht, da Zeitraume bei denen @Date zwischen Beginn und ende Liegen nicht berücksichtigt werden.

Beispiel:

Vertrag beginnt am 01.01.2021 (Beginn) und endet am 31.12.2021 (Ende) ich möchte wissen, ob der Vertrag am 01.10.2021 (@Date) aktiv ist.

Bedingung 1 ([Beginn] >= @Date) Datum Beginn ist größer Gleich 01.10.2021. Bedingung ist falsch
Bedingung 2 ([Ende] <= @Date) Datum Ende ist kleiner Gleich 01.10.2021. Bedingung ist wahr

Bedingung1 AND Bedingung2 Bedingung ist falsch, da Bedingung1 falsch ist. Der Datensatz würde nicht ausgegeben. Wir hingegen sagen der Vertrag ist am 01.10.2021 aktiv (weil zwischen dem 01.01.2021 und dem 31.12.2021) der Datensatz müßte ausgegeben werden.
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
nun ja ...

Code:
edb=*# select * from hexe63;
 id |        begin        |        ende         
----+---------------------+---------------------
  1 | 2021-10-12 00:00:00 | 2022-04-30 00:00:00
  2 | 2022-04-30 00:00:00 | 2022-08-08 00:00:00
(2 rows)

edb=*# select * from hexe63 where '2022-05-30'::date > begin and '2022-05-30'::date < ende;
 id |        begin        |        ende         
----+---------------------+---------------------
  2 | 2022-04-30 00:00:00 | 2022-08-08 00:00:00
(1 row)

edb=*#
 
Bedingung 1 ([Beginn] >= @Date) Datum Beginn ist größer Gleich 01.10.2021. Bedingung ist falsch
Das ist falsch, richtig! Oder sagen wir, die Bedingung ist nicht erfüllt.

Es entspricht aber nicht dem, was @akretschmer vorschlägt.
Ich kann gut verstehen, wenn man irgendwann den Wald vor lauter Bäumen nicht mehr sieht, ich schwör!

Sowohl ein BETWEEN mit gemischter Nutzung von Spaltennamen und Ausdrücken oder Variablen, als auch die Formulierung mit 2 AND verknüpften Bedingungen funktionieren genau so auch in MS SQL.

Einfach mal ne Nacht drüber schlafen.
 
hallo Dabadepdu,

danke für den Hinweis.
Kannst du mir bitte mal ein Beispiel für den WHERE Teil(MSSQL) geben, ich stehe inzwischen so auf'm Schlauch dass ich das Gefühl habe noch nie vor einem PC gesessen zu haben.

Ich denke Between wäre der Ansatz, ich weiss jedoch nicht wie ich der Abfrage sagen soll, dass sie alse Value die werte aus den Spalten Beginn und Ende nutzen soll.
 
Hast Du es selbst mal ausprobiert? Oder nur gelesen? (Was auch nicht verkehrt ist für den Anfang)
Du kannst in Select Clause, Where Clause, usw., (fast) überall in SQL Statements, natürlich auch bei INSERT, UPDATE, DELETE auf alle Felder zugreifen, indem Du einfach ihren Namen hin schreibst.

Was bei MS SQL vielleicht verwirrend ist (für Anfänger oder solche, die MS SQL nicht gewohnt sind), diese eckigen Klammern um die Feldnamen.
Sie dienen nur dem Zweck, möglichst bescheuerte Feldnamen in exotischen Sprachen und mit vielen Leerzeichen nutzen zu können. Benutzt man für die Feldbenennung lediglich den ASCII Zeichenvorrat, so braucht man diese Klammern nicht, auch nicht für Schema / Datenbanknamen. Das macht dann die ganze Sache etwas übersichtlicher. Besonders wenn man auch noch mit Expressions, Arrays, .. im SQL Statement hantiert. Es erhöht auch die Kompatibilität der SQL Statements zu anderen DB Servern ungemein.

Das normale Vorgehen bei der Benennung von Feldern:
kleinschrift, vollständige bzw. deutliche Wörter, ggF. mit _ (Unterstrich) verkettet. Buchstaben ASCII Zeichensatz, also keine Umlaute und keine ASCII Sonderzeichen wie ?& usw.
Diese Felder können dann beliebig in groß/kleinschrift verwendet werden, auch gemischt.

In meinem Beispiel verwende ich keine eckigen Klammern.
 
diese eckigen Klammern um die Feldnamen.
Sie dienen nur dem Zweck, möglichst bescheuerte Feldnamen in exotischen Sprachen und mit vielen Leerzeichen nutzen zu können.
Alternativ kann man auch doppelte Anführungszeichen verwenden, wie es im SQL Standard vorgesehen ist, und was auch von SQL Server unterstützt wird.

Das normale Vorgehen bei der Benennung von Feldern:
kleinschrift, vollständige bzw. deutliche Wörter, ggF. mit _ (Unterstrich) verkettet. Buchstaben ASCII Zeichensatz, also keine Umlaute und keine ASCII Sonderzeichen wie ?& usw.
Full ACK, obwohl das in der SQL Server Welt eher selten so gemacht wird.
 
akretschmer macht wieder die Leute wuschig :)

Code:
WITH tabelle AS (
    SELECT    dateadd(day,-1,convert(DATE,getdate())) AS beginn,
            dateadd(day,1,convert(DATE,getdate())) AS ende
    )
SELECT    *
FROM    tabelle
WHERE    convert(DATE,getdate()) BETWEEN beginn AND ende
...sollte zeigen das das, was in deinem aller ersten Post schon steht, geht. Sonderlich speziell ist das gar nicht.

PS: convert(DATE,getdate()) weil man sonst ganz schnell wegen der Uhrzeit (die getdate() mit liefert) unerwartete Ergebnisse bekommt. Achte darauf das hier wirklich nur ein Datum in den Spalten und Variablen steht.
 
Hallo Dabadepdu und alle anderen die mir geholfen haben!

Erstmal Danke an @dabadepdu, es Funktioniert. Leider benutze ich die "bescheuerten Spaltennamen" in meiner Datenbank. Um nicht zu sehr vom Thema wegzukommen hatte ich alles was nicht notwendig ist eingekürzt, aber diese Klammern vergessen zu entfernen.

Im wesentllichen ist deine Lösung ja das was ich in meinem ersten Post geschrieben habe.
Where [ Value / Wert ] between [Spaltenname1 (Beginn) ] and [Spaltenname2 (Ende)]
Ich hatte jedoch Probleme damit, da:

1. ich keine explizite Convertanweisung für meinen Wert angegeben habe
2. meinen Wert ams Variable angegeben habe

Hierdurch habe ich mich mehr oder weniger selber ausgetrickst. Weiterhin geben alle Besispiele die ich irgend wo in den weiten des Web gefunden habe immer nur die "normale" Variante an.

Wie dem auch sei, es Funktioniert nun und ich bin dankbar.

Dake also an alle die mir geholfen haben.

Gruß aus Berlin
Und bleibt Gesund!
 
Wie dem auch sei, es Funktioniert
Prima!

Wenn Du Dir etwas Zeit nimmst, auch die Vorschläge von @akretschmer funktionieren.
Du könntest auf dbfiddle gehen und sie für postgres ausprobieren und auf ms sql übertragen, es ist kaum etwas zu ändern, wahrscheinlich nur die Datumshandhabung. Bei Verwendung von Variablen eher nichts zu ändern (wenn sie richtig/passend befüllt sind, siehe unten).

Code:
@Date
Und noch mal zu Notation und Daumenregeln, das kann man auch für Variablennamen umsetzen. Ein Variablenname (wie ein Feldname), der einer Funktion, einem Befehl oder einem Typ entspricht (date), ist nicht sehr wünschenswert. Da Du offenbar mit deutschen Spaltennamen arbeitest, wäre demnach eine Variable namens
Code:
aktuelles_datum
oder hier auch einfach die Funktion getdate() hilfreich, wie sie @ukulele in seinem Beispiel verwendet hat.
Hier muss ich gestehen, ich weiß gar nicht, ob man in MS SQL auch Variablen in eckige Klammern setzen könnte, aber das @ müsste eigentlich klar sein.

Für Datumsverarbeitung gilt aber noch mehr als bei Zahlen, sauber zu konvertieren. Das bedeutet vor allem explizit zu konvertieren, also den Datumsstring und das gewollte Format beide anzugeben (bei MS SQL werden dazu Formatkonstanten wie z.B. 103 verwendet.

Ansonsten hilft es auch, Fehlermeldungen wahrzunehmen, zu verstehen oder hier zu posten, falls unklar. Spart viele Missverständnisse und Nachfragen.
 
ja, das ist korrekt. Viele Dinge von PostgreSQL gehen in diversen anderen Systemen halt schlicht nicht.
deswegen macht es kein Sinn, das du unnütze Antworten im MSSQL Server Forum posten, die sowieso nicht funktionieren.
Tja, die Welt wäre besser wenn alle Datenbanken so gut wie PostgreSQL wären, aber dennoch denke ich, in der Form

select ... from ... where DATUM > begin and DATUM < ende

sollte es funktionieren...
Tja, die Welt wäre besser dran wenn du deine Postgres Fanboy Posts einfach im Postgres Bereich lassen würdest. Als Consultant würde ich dich übrigens nicht engagieren. Du weißt nicht was ein Tellerrand ist und blickst auch nicht drüber. Nur Postgres ist für dich geil.
 
Du darfst gern bessere Lösungen zeigen, kein Problem. Dumm rumblödeln darfst Du natürlich auch, falls Du das brauchst. Viel Erfolg damit!
 
Werbung:
Erstmal: Schönen Sonntag zusammen!

Das Spezielle an diesem Thread ist doch, dass das Problem ganz im Gegensatz zum gewählten Titel überhaupt nicht speziell ist!

unnütze Antworten

Alle Lösungen von @akretschmer funktionieren und sind mit minimalem Aufwand nachvollziehbar und auch übertragbar auf andere Systeme. Weil SQL eben doch ein Standard ist.
Code:
select * from hexe63 where current_date > begin and current_date < ende;
Code:
select * from hexe63 where '2022-05-01'::date > begin and '2022-05-01'::date < ende;
Code:
select * from hexe63 where '2022-05-30'::date between begin and ende;

Ausnahme ist lediglich die Nutzung von Range Types, die sind eher selten bei anderen DB Anbietern.
Code:
select * from demo where von_bis @> current_date;

Für erfahrene Nutzer sicher nicht spannend: das Prinzip (die Syntax) dieses Statements funktioniert in wirklich jedem relationalen DB System.
Code:
select * from tabelle t where <datumsvariable_oder_datumsfunktion> between t.start_datum and t.end_datum;
Ebenso die Varianten mit Kleiner, Größer, Gleich (<,>,=).

Interessant ist doch, dass und warum Anfänger damit nicht zurecht kommen. Hier in diesem Fall muss man ja wohl leider feststellen, dass
- die Handhabung von Datumstypen und Datumsfunktionen doch bei jedem Anbieter recht unterschiedlich ist (oder sagen wir, den Standard unterschiedlich abdeckt) und damit eben weniger (ANSI) Standard ist.
- (Anfängern) selten klar ist, wann und warum explizite oder implizite Datumskonvertierung erfolgt und wo die Probleme dabei liegen (prinzipbedingt oder herstellerspezifisch)
- ebenso wenig klar ist, dass „fehlende“ (gleichnamige ANSI) Standard Funktionen einfach selbst zu schreiben sind (oder tw. sogar als Kompatibilitätspakete zu anderen Anbietern installierbar wären)
- die Handhabung von Datumstypen per Variablen / Parametern in unterschiedlichen DB aus Perspektive der Clientprogrammierung von allein verschwinden, wenn sie optimal per parametrierter Abfrage erfolgen
- MS SQL als einziges mir bekanntes System eine Sonderrolle einnimmt, weil es keinen Unterschied zwischen der Abfragesprache und der Programmiersprache macht (und was das impliziert)

Was in diesem Thread auch noch aufgetaucht ist (und immer wieder auftaucht),
die fehlerhafte Anwendung von verketteten Bedingungen mit AND oder OR plus der Namensanalogie hier (AND) im BETWEEN Konstrukt.

Gut, also ein Großteil von Problem resultiert eigentlich nur aus dem Datumstyp und herstellerspezifischer Handhabung von Datumstypen.
Das gleiche Problem mit einer Zahlenreihe statt einer Datumsreihe wäre also auf Anhieb 100% kompatibel.

Warum schreib ich das alles? Man kann natürlich beklagen, dass in einem Forum unpassende Hilfestellung gegeben wird, ja, MS SQL ist natürlich nicht Postgres. Aber es ist nicht so, dass es hier um entfernte Galaxien geht, um grundlegend unterschiedliche Programmiersprachen wie C und Scheme oder Pascal.
Darüber hinaus ist es natürlich etwas befremdlich, wenn beklagt wird, dass überhaupt Hilfestellung gegeben wird(, die angeblich unpassend ist). Und
ernsthaft: Muss man wirklich kritisieren, dass jemand die hervorragenden Features eines kostenlos verfügbaren Datenbanksystems herausstellt und so tun als würden MS Kenner (Consultants, Berater, Freelancer, ..), die alle mit MS Produkten schön Geld verdienen, andere/Konkurrenz Systeme empfehlen bzw. über den Tellerrand schauen? (Das geschieht wohl vorwiegend, um sich etwas abzuschauen)

Ich habe an der Stellen jedenfalls umgekehrt kein Mitleid mit MS, seinen Vertretern und seinen Produkten. Sie sind teuer genug und müssen sich halt einem Wettstreit stellen, den man nicht mal als fair bezeichnen kann.
Mir scheint es da eher lächerlich, in dem Zusammenhang das Wort „Fanboy“ zu benutzen. (aus dem Munde eines Users namens t-sql). Mir ist in diesem Forum nur ein User bekannt, der nicht nur namentlich keine Unklarheiten über sich und seine Motive lässt.

Aber zurück: Ich stelle mal die These in den Raum, dass vielleicht gerade die Unterschiede der Systeme gar nicht so schlecht sind, um Sachverhalte und Funktionsprinzipien besser zu begreifen oder zu erklären. Immer vorausgesetzt, jemand will sie überhaupt begreifen und nicht nur eine Copy/ Paste Lösung absaugen.

Das Tolle ist doch, dass alle diese Systeme online im Netz für Tests verfügbar und vergleichbar sind, inklusive Dokumentation! Es ist wirklich ein Nobrainer, in Sekunden im Browser einen Lösungs-Vorschlag in einer „fremden“ DB auszuprobieren und zu vergleichen.
Und wenn man möchte, kann man sich in etwas mehr Sekunden eine komplett kostenlose Opensource DB installieren und testen, üben, entwickeln bis der Arzt kommt, ohne Lizenzrisiko und ohne Anwaltsbüro im Anschlag.

Wir sind hier vermutlich alle nicht mehr im Kindergarten und jeder User kann jederzeit anhand der Beiträge selbst entscheiden, was er mit den erlangten Informationen anstellt und welche Schlüsse er daraus zieht.

In diesem Sinne wünsche ich allen weiterhin eine sachliche, hilfreiche und erhellende Diskussion! Sportlich bleiben!
 
Zurück
Oben