2016-12-09 3 views
0

Ich habe eine Abfrage, die ein fortlaufendes Teilformular mit Datensätzen aus SQL Server füllt. Wenn ich meinen Code wie folgt habe, füllt er alles normal auf.MS Access Daten schalten mich ein

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE StartDate <= 42720 and EndDate >= 42720" 

Aber wenn ich die oder Bedingung am Ende (siehe unten) hinzufügen, werden meine Daten plötzlich um 2 versetzt! (2 Tage vor der Abfrage oben).

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE StartDate <= 42720 and EndDate >= 42720 or ID = 16801;" 

Ich weiß, MS Access eine seltsame Sache hat, wo es durch 2 von SQL Server unterscheidet, weil er 1900 als Schaltjahr zählt und startet bei 1 statt 0 Aber warum ist das passiert an dieser Stelle? Das macht mich traurig.

edit: Keine der Antworten hat mir bisher gesagt, WARUM das Hinzufügen einer ID = Bedingung ändert plötzlich die Datumsinterpretation von SQL zu Access, aber eine Antwort löst das Problem, so habe ich es als die akzeptierte Antwort markiert.

Antwort

1

Zuerst Ihren Kriterien braucht eine grundlegende Korrektur:

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= 42720 and EndDate >= 42720) or ID = 16801;" 

Zweitens sollten Sie immer Termine als Datumswerte angeben, keine Zahlen, keine Strings, keine Ausnahmen. Also:

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= #2016/12/16# and EndDate >= #2016/12/16#) or ID = 16801;" 

oder:

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= DateSerial(2016,12,16) and EndDate >= DateSerial(2016,12,16) or ID = 16801;" 
+2

ich Klammern glauben sollte nicht Ergebnisse beeinflussen, weil 'und' immer vor' or' ausgeführt, aber wie auch immer, darüber einig, dass explizite Ausführungssequenz besser wäre –

+0

Sie haben Recht . _Between-And_ wird zuerst ausgewertet, dann die beiden Seiten von _Or_. – Gustav

+0

Also muss ich meine SQL-Ansicht das Datum in eine Datumswert-Zeichenfolge konvertieren, die ich in meiner VBA verwende? – Mike

0

Try this:

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= 42720 and EndDate >= 42720) or ID = 16801;" 
0

Sieht aus wie in ersten Fall SQL auf SQL Server-Seite ausgewertet - direkt an SQL Server übergeben, in diesem Fall Zahl bisher auf SQL-Seite umgewandelt, die 0 als 1/1 interpretiert/1900. Second Select wird bereits auf der Access-Seite zuerst evaluiert, konvertiert die Nummer nach Datum durch Access-Regeln, wobei 0 1/31/1899 ist, und dann wurde SQL Server bereits mit Datumsangaben in Argumenten übergeben. Sie können SQL, das an SQL Server übergeben wird, in beiden Fällen abfangen und meine Version überprüfen.

Seien Sie also sehr vorsichtig mit Zahlen anstelle von expliziten Daten, wenn Sie mit Server arbeiten, der mit Access verschiedene Konvertierungsregeln hat. Sie können nicht sicher sein, dass SQL ohne zusätzliche Auswertung auf der Access-Seite an den Server übergeben wurde, wenn Sie keine SQL Pass-Through-Abfragen verwenden.