2009-10-07 137 views
1

我有一個包含用於用戶輸入的兩個文本框的表單。兩個文本框都將「屬性」格式設置爲「短日期」。一個是「開始日期」,另一個是「結束日期」。我也有幾個表,每個表都有一個DateTime字段(「studystartdatetime」)。我希望能夠查詢這些表,但將結果限制爲DateTime字段在輸入日期(含)之間的行。目前,該條件是:Access 2007:查詢兩個短日期值之間的日期時間字段

WHERE s.studystartdatetime BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate 

然而,這不返回發生指定的結束日期的行。

我已經試過CDATE,格式,則DateValue的每一個組合,我能想到的,其中用於包裝一個或所有這些領域,但我總是收到相同的神祕的錯誤:

The expression is typed incorrectly, or it is too complex to be evaluated. For example, a numeric expression may contain too many complicated elements. Try simplifying the expression by assigning parts of the expression to variables.

一些例子的條件我曾嘗試:

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 

等等

任何輸入到這將不勝感激:)

回答

2

發生什麼事情是,您的短日期輸入在用戶輸入的當天開始的午夜產生日期時間值。因此,2009年1月1日至2009年1月10日的範圍(或您的系統中使用的任何簡短日期格式)正在搜索1月1日開始至1月10日開始的事件, 1月10日晚些時候發生的事件。

要更正,請將用戶放入搜索的結束日期加1。這將從1月1日開始到1月11日開始搜索,包括1月10日的所有事件。

最後,發生在事件正好午夜1月11日的可滑動到您的結果這種方式,所以不是用你們之間應該使用

studystartdatetime> =形式!frmMain!txtStartDate和studystartdatetime <形式!frmMain!txtEndDate + 1

+0

我曾考慮過這樣做,但出於某種原因,只是認爲不可能添加到這樣的日期值。無論如何,謝謝! – Richard 2009-10-07 17:33:16

0

Larry的回答對你來說是正確的答案,但讓我列舉一些在這裏提出的問題。

  1. 你需要的日期格式和日期存儲之間進行區分。在Jet/ACE數據庫引擎(Access的默認數據庫引擎)中,日期存儲爲一天中的整數和時間的小數部分。這就是爲什麼你可以添加一個數字(或一個小數)到一個日期並得到一個正確的結果,因爲該日期的基本表示的整個數字部分表示自1899年12月30日以來的天數(它不是Dec的原因第三十一號是複雜的 - 有人在計算閏年時搞砸了,所以一大堆程序寫的是關於1899年12月31日實際上是什麼時候的錯誤假設)。

  2. 「短日期」 是一個日期格式,標準的M/d/YY(或m/d/yyyy的,這取決於Windows和訪問兩個本地設置)。它與存儲在表格中的實際基礎日期值無關,但如果使用格式化結果,則會產生巨大影響。例如,Format(Date(),「m/d/yyyy」)返回一個字符串,而不是日期值。這是一個可以隱式強制爲日期值的字符串,而且通常透明地依賴於該字符串。但是您仍然必須瞭解Format()函數返回一個字符串,並且該字符串不會始終被視爲日期。

  3. 噴氣/ ACE SQL預計格式的日期在美國的順序傳遞,反直覺的M/d/yyyy的,而不是更合乎邏輯的d/M/yyyy或更好的是,ISO標準YYYY /平方米/ d。正因爲如此,只要您使用爲Windows設置的非美國語言環境運行您的應用程序,就需要明確您的日期。這意味着將日期轉換爲非歧義格式(d/mmm/yyyy可行,因爲它指定了數字中的日期和字母中的月份),或者使用DateSerial()函數處理所有日期。這適用於WHERE子句中的日期條件或SELECT語句中正在進行日期計算的任何地方 - 將日期以非歧義格式或DateSerial()傳遞給函數,您將避免此問題。