Access 2007: Abfragen für DateTime-Feld zwischen zwei Kurzen Datum-Werte
Ich habe ein Formular mit zwei Textfeldern für Benutzereingabe. Beide Textfelder haben die Eigenschaft format der Einstellung "Kurzes Datum". Der eine ist die "start-Datum", und die andere ist die "Ende-Datum". Ich habe auch mehrere Tabellen, die jeweils mit einem DateTime-Feld ("studystartdatetime"). Ich möchte in der Lage sein, auf diese Tabellen Abfragen, aber die Ergebnisse einschränken auf die Zeilen, deren DateTime-Felder sind die zwischen den eingegebenen Daten (inklusive). Derzeit ist die Bedingung:
WHERE s.studystartdatetime BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate
Diese, jedoch nicht die Rückgabe von Zeilen, die aufgetreten sind auf die enddate angegeben.
Ich habe versucht, jede Kombination von CDate Format, und DateValue, dass ich mir vorstellen könnte, in dem wrap eine oder alle dieser Felder, aber ich erhalte immer die gleiche kryptische Fehlermeldung:
Wird der Ausdruck falsch eingegeben oder er ist zu Komplex, um ausgewertet werden. Zum Beispiel einen numerischen Ausdruck enthält möglicherweise zu viele komplizierte Elemente. Versuchen Sie, die Vereinfachung des Ausdrucks durch die Zuordnung von teilen des Ausdrucks Variablen.
Einige Beispiele von Bedingungen, die ich versucht habe:
WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate
WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate
WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd"))
WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd"))
WHERE DateValue(Format(s.studystartdatetime, "Short Date")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate
Etc.
Jede Eingabe in diese wäre sehr dankbar 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was passiert, ist, dass Ihr kurzes Datum-Eingaben erzeugen, die datetime-Werte, die um Mitternacht auf den Beginn des Tages des Benutzers eingegeben werden. Also, der Reihe 2009-1-1 zu 2009-1-10 (oder was auch immer das kurze Datum-format ist auf Ihrem system verwendet wird) sucht für die Veranstaltungen von Anfang Januar-1. die Anfang der 10. Januar und ohne die Ereignisse, die später passiert am 10. Januar.
Zu korrigieren, fügen Sie 1, um das Ende-Datum wird der Benutzer legt in der Suche. Dadurch wird die Suche vom Anfang der 1. Januar auf Anfang Januar 11th, einschließlich aller Ereignisse, am 10. Januar.
Schließlich Ereignisse, die sich auf genau Mitternacht des 11. Januar rutschen in Ihre Ergebnisse auf diese Weise, anstatt ZWISCHEN die Sie verwenden sollten
studystartdatetime >= Formulare!frmMain!txtStartDate UND studystartdatetime < Formen!frmMain!txtEndDate + 1
Larry ' s Antwort war die richtige Antwort für Sie, aber lassen Sie mich zeichnen sich einige der aufgeworfenen Fragen hier.
müssen Sie unterscheiden zwischen Datum-format Datum und Lagerung. In die Jet/ACE-Datenbankengine (Access-Standard-Datenbank-engine), Termine sind als Ganzzahl gespeichert, für den Tag und einen Dezimalteil für die Zeit. Dies ist der Grund, warum Sie können eine Ziffer (oder eine dezimale) zu einem Zeitpunkt, und erhalten ein korrektes Ergebnis, weil die ganze Zahl Teil der zugrunde liegenden Repräsentation von Daten stellt die Tage seit Dez. 30, 1899 (der Grund, warum es nicht Dez. 31 ist kompliziert -- jemand, schraubte sich in die Berechnung von Schaltjahren, und so eine ganze Reihe von Programmen, die geschrieben wurden, mit den falschen Annahmen über die bei der Dez. 31, 1899 tatsächlich war).
"short date" ist ein Datum-format, das standard-m/d/yy (oder m/d/yyyy, je nach Ihren lokalen Einstellungen in Windows und Access). Es hat nichts zu tun mit der tatsächlich zu Grunde liegenden Datum gespeicherten Werte in der Tabelle, aber es kann einen großen Effekt, wenn Sie mit den Ergebnissen arbeiten zu formatieren. Zum Beispiel, " Format(Datum(), "m/d/yyyy") gibt einen string zurück, nicht einen date-Wert. Es ist ein string, kann implizit dazu gezwungen, um einen date-Wert, und man sehr oft stützt sich auf das geschehen transparent. Aber Sie haben noch zu verstehen, dass die Format () - Funktion einen string zurückgibt, und dass der string nicht immer so behandelt werden, als ein Datum.
Jet/ACE-SQL erwartet formatierten Daten übergeben zu werden, die amerikanische Ordnung, die counter-intuitive, m/d/yyyy, wird anstelle des logischen d/m/yyyy oder, noch besser, den ISO-standard yyyy/m/d.... Denn dieser, jedes mal, wenn Sie Ihre app mit einem nicht-US-Gebietsschema für Windows festlegen, müssen Sie explizit über Ihre Termine. Dies bedeutet, Gießen Sie Ihre Daten zu einer nicht-mehrdeutigen-format (d/mmm/yyyy funktioniert, weil es gibt den Tag als Ziffer, der Monat in Buchstaben), oder alle Ihre Daten mit der DateSerial () - Funktion. Dies gilt-bis-Datum-Kriterien in Ihrer WHERE-Klausel oder überall in Ihrer SELECT-Anweisung, die Sie tun, Datums-Berechnungen -- übergeben Sie das Datum in die Funktionen, die in einer nicht-mehrdeutigen-format oder mit DateSerial() und vermeiden Sie dieses problem.