Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Syntaxproblem Case Anweisung

Begonnen von ellinho, März 01, 2012, 19:31:52

⏪ vorheriges - nächstes ⏩

ellinho

Hallo. Vielleicht kann kurz jemand drüberschauen :
In der Syntax muss noch ein Fehler stecken.

WHERE  CASE WHEN (Month(getdate())=1) THEN (DATEDIFF(yyyy,dbo.tblAlleTage.TDatum, (getdate()))=-1) ELSE (DATEDIFF(yyyy,dbo.tblAlleTage.TDatum,(getdate())))=0 END)


Danke.

Gruß
Karsten

MzKlMu

#1
Hallo,
einer  ;D Jede Menge.  ;D
CASE WHEN, ELSE und END gibt es nicht in SQL, Du musst IIf (mit 2 I) verwenden. Die einzelnen Teile werden einfach durch Komma getrennt.
YYYY muss in Anführungszeichen eingeschlossen werden.
Zu IIF findest Du Hinweise in der VBA Hilfe.

Was macht die Funktion getdate() ? Ist mir nicht bekannt.

Erkläre bitte auch mal was Du mit dieser Wehre Klausel erreichen willst.
Gruß Klaus

ellinho

Hallo.

Komisch eigentlich. Ich meine, ich hätte gestern noch so eine Abfrage mit WHERE CASE THEN END usw. gehabt, die funktionierte. Leider brauchte ich die Abfrage zwischenzeitlich nicht mehr und habe sie gelöscht. Es kann sein, dass IIf da auch mit drin steckte.
Allerdings bekomme ich die genaue Syntax nicht mehr auf die Reihe. Hatte mir gestern schon einen abgebrochen.
Kann mir jemand einmal aufschreiben, in welcher Reihenfolge die Anweisungen erfolgen müssen und wie die Syntax genau lautet ?
Im Prinzip brauche ich hier schlicht und weg eine Zeitabgrenzung. Ich betrachte den Urlaub des aktuellen Jahres. Die Funktion soll, wenn das aktuelle Systemdatum im Januar liegt (also z.B. 09.01.2013) den Urlaub von 2012 anzeigen, ansonsten Systemdatum = Feb-Dez = Urlaub von 2013 und dauerhaft gültig sein.
Die Funktion getdate() zeigt den aktuellen Datenbanksystemzeitstempel an.

MzKlMu

Hallo,
die Syntax von IIF findest Du wie gesagt in der Hilfe. Mit Beispiel.
Den aktuellen Datenbanksystemzeitstempel bekommst Du auch mit der Accessfunktion Date(), dazu bedarf es keiner extra Funktion.
Und YYYY muss in AZ: "YYYY"
Gruß Klaus

Bitsqueezer

Hallo ellinho,

vielleicht solltest Du dazu schreiben, wo Du diese WHERE-Klausel abzusetzen versuchst. Das ist natürlich T-SQL und funktioniert auf einem SQL Server (oder als Pass-Through-Abfrage auch in Access). Wenn Du dagegen nur auf verknüpfte SQL Server Tabellen zugreifen möchtest, dann kannst Du auch nur Access SQL verwenden, da gibt es in der Tat kein CASE WHEN und auch kein GetDate() (was übrigens der Funktion "Now()" in Access entspricht). In T-SQL setzt man bei DATEDIFF tatsächlich keine Anführungszeichen, in Access SQL sind sie notwendig.

Du solltest Dich also erst mal entscheiden, was Du da genau ausführen möchtest und wo. Darüber hinaus ist es in Verbindung von Access zu SQL Server immer empfehlenswert, solche Abfragen als Views auf dem Server zu speichern (womit Du auch wieder volles T-SQL verwenden kannst) und nur die Views als "Tabellen" in Access einzubinden. Das bringt deutlich bessere Performance.

Gruß

Christian

MzKlMu

Hallo,
dass hier eine andere SQL Sprache zum Einsatz kommt, war natürlich nicht klar.
Wobei ich aber dazu ohnehin nichts hätte beitragen können.
Da sieht man mal wieder, dass es gut ist, wenn viele (und erfahrene User) hier mitlesen bzw. sich auch einbringen.
Gruß Klaus

ellinho

Sorry. Hatte vergessen, zu erwähnen, dass ich mit einem adp-Projekt arbeite und auf dem SQL-Server eine Sicht erstelle.
Ich dachte, weil ich ja hier im SQL-Forum schreibe, wäre das klar.

Hier übrigens mal die WHERE-Anweisung, so wie sie momentan funktioniert (das rot markierte soll noch geändert werden, da nicht allgemeingültig)
(dbo.tblAlleTage.TDatum BETWEEN dbo.Abwesenheit.Datumvon AND dbo.Abwesenheit.Datumbis) AND (dbo.tblAlleTage.Stundenfaktor <> 0) AND (dbo.Sollstunden.Sollstd <> 0) AND (dbo.Abwesenheit.Abwesenheitsgrund = 'Urlaub') AND (DATEDIFF(yyyy, dbo.tblAlleTage.TDatum, { fn NOW() }) = 1)

So ist sie gültig für Januar 2012, weil sie mir die Urlaubsdatensätze von 2011 anzeigt (korrekt). Im Februar 2012 zeigt sie mir aber ebenfalls die Datensätze aus 2011 an...von Feb 2012 bis Jan 2013 soll sie mir aber die Datensätze aus 2012 anzeigen. Der rot markierte Teil der WHERE-Anweisung dient hier somit nur einem Veranschaulichungszweck. Dieser müsste raus und salopp gesagt, so aufgebaut werden :
Wenn(DATEPART(m,{fn NOW())=1) (d.h. wir haben Januar) DANN (DATEDIFF(yyyy,dbo.tblAlleTage.TDatum,{fn NOW())=1) SONST (DATEDIFF(yyyy,dbo.tblAlleTage.TDatum, {fn NOW())=0)   Danach müssen aber noch die anderen 4 Bedingungen rein. Aus diesem Grund bin ich beim Aufbau etwas überfragt.

MzKlMu

Hallo,
das ist jetzt meine Schuld, ich habe nicht auf das Forum geachtet. Sorry, für die Verwirrung.
Gruß Klaus

ellinho

Habe es mir zwischenzeitlich umgestrickt. Baue es mir nun anders auf. Betrachte immer das aktuelle Jahr.