2014-04-01 68 views
0

下面的查詢不返回任何值。在日期之間搜索時出現問題Microsoft Access

SELECT o.ea_guid as CLASSGUID, o.Object_Type as CLASSTYPE, 
     o.Name, type.Property, type.Value 
FROM ((t_object as o 
     INNER JOIN t_objectproperties as location 
     ON o.Object_ID = location.Object_ID) 
     INNER JOIN t_objectproperties as type 
     ON o.Object_ID = type.Object_ID) 
WHERE location.Property = 'Location' 
    AND location.Value = 'ND' 
    AND type.Property = 'FDate' 
    AND CDate(type.Value) >= CDate('21/02/2014') 
    AND CDate(type.Value) <= CDate('24/02/2014') 

然而,如果i執行以下則返回一組結果的不需要的範圍

SELECT o.ea_guid as CLASSGUID, o.Object_Type as CLASSTYPE, 
    o.Name, type.Property, type.Value 
    FROM ((t_object as o 
     INNER JOIN t_objectproperties as location 
      ON o.Object_ID = location.Object_ID) 
     INNER JOIN t_objectproperties as type 
      ON o.Object_ID = type.Object_ID) 
    WHERE location.Property = 'Location' 
    AND location.Value = 'ND' 
    AND type.Property = 'FDate' 
    AND type.Value >= CDate('21/02/2014') 
    AND type.Value <= CDate('24/02/2014') 

我也使用BETWEEN嘗試和它的範圍之外的返回結果之間落下。

SELECT o.ea_guid as CLASSGUID, o.Object_Type as CLASSTYPE, 
     o.Name, type.Property, type.Value 
    FROM ((t_object as o 
      INNER JOIN t_objectproperties as location 
      ON o.Object_ID = location.Object_ID) 
      INNER JOIN t_objectproperties as type 
      ON o.Object_ID = type.Object_ID) 
    WHERE location.Property = 'Location' 
     AND location.Value = 'ND' 
     AND type.Property = 'FDate' 
     AND type.Value BETWEEN CDate('21/02/2014') 
     AND <= CDate('24/02/2014') 
+0

你有沒有嘗試在WHERE子句中沒有日期參數的情況下運行它,它起作用了嗎? –

+0

@Newbie - 但是它返回整個結果集,而不是將它們限制在那些日期之間的結果集。 – PeanutsMonkey

+0

我不認爲我會使用CDate ..我會使用'Format(YourDate,「ShortDate」)' –

回答

1

所以,我試了這個,它的工作。您可以將type.Value轉換爲日期,然後將Format()轉換爲短日期,然後傳遞參數。不需要混淆Access不真正關心的日期格式。只是格式化它。

SELECT t1.ID, t1.dateString 
FROM Table1 AS t1 
WHERE Format(CDate(t1.dateString), "Short Date") < Format(#03/31/2014#, "Short Date"); 

dateString是一個文本字段(像你說你是),我與測試值是:

+-------------+ 
| 10/01/2014 | 
+-------------+ 
| 20/02/2014 | 
+-------------+ 
| 31/03/2014 | 
+-------------+ 

下面是使用BETWEEN的SQL:

SELECT t1.ID, t1.dateString 
FROM Table1 AS t1 
WHERE Format(CDate(t1.dateString), "Short Date") 
Between 
       Format(#03/30/2014#, "Short Date") 
AND 
       Format(#01/01/2014#, "Short Date") 
+0

謝謝。這似乎工作,如果我把它限制在一個單一的日期,例如<2014年3月31日。只要我在兩個日期之間嘗試,它會返回結果超出這些日期範圍。 – PeanutsMonkey

+0

嗯。你是否試圖扭轉邏輯?如果它給你的是相反的(我不知道爲什麼會這樣),你可以翻轉'<' or '>'? –

+0

我只是試了一下,它工作(沒有顛倒邏輯)。我將編輯我的帖子。 –

1

問題與日期字符串是,像01/02/2014日期可以解釋爲dd/MM/yyyyMM/dd/yyyy。最好以反向格式存儲日期:yyyy/MM/dd。我從來沒有見過像yyyy/dd/MM這樣的格式。因此,日月混淆應該是安全的。

逆格式的另一個優點是它的字符串表示法與日期表示法相同。即以yyyy/MM/dd格式排序字符串會產生正確的順序。因此沒有必要將它們轉換爲比較日期。


儘量選擇Month(CDate(type.Value)),看看這真的總是返回幾個月或是否有時會返回天。如果天返回,你可以嘗試轉換這樣的屬性

DateSerial(Mid$(type.Value, 7) , Mid$(type.Value, 4, 2), Mid$(type.Value, 1, 2)) 
+0

'格式(#17/04/2004#,「YYYY/MM/DD」)的格式'是OP的最好的選擇,我認爲?你怎麼看?除非他每次都一致地格式化爲短日期。我也使用yyyyMMdd。 –

+0

'yyyyMMdd'的問題是'CDate'不能識別它。 –

+0

@Olivier Jacot-Descombes - 很遺憾,我無法控制日期的存儲方式,因爲它使用的是第三方應用程序。 – PeanutsMonkey