2012-04-12 50 views
1

我在比較訪問數據庫中的日期時遇到問題。基本上我從文本字段解析出日期,然後嘗試將該日期與另一個日期進行比較,以僅取出較新/較舊的記錄。比較Access中的日期值 - 條件表達式中的數據類型不匹配

到目前爲止我有一切工作,但是當我嘗試將表達式添加到where子句時,它的行爲就像它不是日期值。

這裏是完整的SQL:

SELECT 
Switch(Isdate(TRIM(LEFT(bc_testingtickets.notes, Instr(bc_testingtickets.notes, ' ')))) = false, 'NOT  ASSIGNED!!!') AS [Assigned Status], 
TRIM(LEFT(bc_testingtickets.notes, Instr(bc_testingtickets.notes, ' '))) AS [Last Updated Date], 
bc_testingtickets.notes AS [Work Diary], 
bc_testingtickets.ticket_id, 
clients.client_code, 
bc_profilemain.SYSTEM, 
list_picklists.TEXT, 
list_picklists_1.TEXT, 
list_picklists_2.TEXT, 
list_picklists_3.TEXT, 
bc_testingtickets.createdate, 
bc_testingtickets.completedate, 
Datevalue(TRIM(LEFT([bc_TestingTickets].[notes], Instr([bc_TestingTickets].[notes], ' ')))) AS datetest 

FROM list_picklists AS list_picklists_3 
RIGHT JOIN (list_picklists AS list_picklists_2 
      RIGHT JOIN (list_picklists AS list_picklists_1 
         RIGHT JOIN (bc_profilemain 
            RIGHT JOIN (((bc_testingtickets 
                LEFT JOIN clients 
                ON 
bc_testingtickets.broker = clients.client_id) 
       LEFT JOIN list_picklists 
       ON 
bc_testingtickets.status = list_picklists.id) 
      LEFT JOIN bc_profile2ticketmapping 
       ON bc_testingtickets.ticket_id = 
        bc_profile2ticketmapping.ticket_id) 
    ON bc_profilemain.id = 
     bc_profile2ticketmapping.profile_id) 
ON list_picklists_1.id = bc_testingtickets.purpose) 
ON list_picklists_2.id = bc_profilemain.destination) 
    ON list_picklists_3.id = bc_profilemain.security_type 
WHERE (((list_picklists.TEXT) <> 'Passed' 
    AND (list_picklists.TEXT) <> 'Failed' 
    AND (list_picklists.TEXT) <> 'Rejected') 
    AND ((bc_testingtickets.ticket_id) <> 4386)) 
GROUP BY bc_testingtickets.notes, 
    bc_testingtickets.ticket_id, 
    clients.client_code, 
    bc_profilemain.SYSTEM, 
    list_picklists.TEXT, 
    list_picklists_1.TEXT, 
    list_picklists_2.TEXT, 
    list_picklists_3.TEXT, 
    bc_testingtickets.createdate, 
    bc_testingtickets.completedate, 
    DateValue(TRIM(LEFT([bc_TestingTickets].[notes], Instr([bc_TestingTickets].[notes], ' ')))) 
ORDER BY Datevalue(TRIM(LEFT([bc_TestingTickets].[notes], Instr([bc_TestingTickets].[notes], ' ')))); 

我試圖比較針對不同的日期值是這樣的:

DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) 

如果我增加一個小節where子句像下面,我得到的數據類型不匹配錯誤:

WHERE DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > #4/1/2012# 

我甚至嘗試過使用DateValue函數週圍的手冊d吃了我與測試,但我仍然得到了不匹配的錯誤:

WHERE DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > DateValue("4/1/2012") 

如何我可以比較該方法的日期任何提示?我無法更改數據庫中的任何字段等,這就是爲什麼我在SQL中解析日期並試圖操作它,以便我可以運行報告。

我試過Google搜索,但沒有具體談到從文本解析日期並將其轉換爲日期對象。我認爲這可能是一個錯誤或日期從左/修剪函數返回的方式。你可以看到我在SELECT語句的末尾添加了一個名爲DateTest的列,它顯而易見的訪問是將它當作一個日期(當查詢運行時,它要求按照最早到最新/最新到最早的順序排序,而不是AZ或ZA),不同於選擇中的第二列。

在此先感謝任何關於如何根據日期查詢的提示/線索。

編輯: 我只是想在下面的語句我的where子句中,仍然得到一個不匹配:

CDate(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > #4/1/2012# 
CDate(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > 
CDate("4/1/2012") CDate(DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[‌​notes],' '))))) > #4/1/2012# 

我嘗試了所有我能想到的關於把CDATE DateValue將裏面的各種組合外,等。雖然CDate功能看起來像我應該使用的。不知道爲什麼它仍然拋出錯誤。

這裏是鏈接到屏幕截圖,顯示查詢結果http://ramonecung.com/access.jpg。在一張圖片中有兩個截圖。

+0

這是http://stackoverflow.com/questions/9901972/how-can-i-sort-by-date-in-ms-access-2007/9904722#9904722任何幫助? – Fionnuala 2012-04-12 21:42:16

回答

0

你報你的數據類型不匹配錯誤與此WHERE子句。

WHERE DateValue(Trim(Left([bc_TestingTickets].[notes], 
    InStr([bc_TestingTickets].[notes],' ')))) > #4/1/2012# 

這使我懷疑[bc_TestingTickets].[notes]是否能永遠是零,或者是因爲表的設計允許空該字段,或空值被設計禁止,但在查詢中的候選行作爲結果左或右連接。

如果空值存在,您的情況可能與此類似簡單的查詢,這也觸發了數據類型不匹配錯誤:

SELECT DateValue(Trim(Left(Null,InStr(Null,' ')))); 

如果這被證明是你的問題的原因,你將不得不設計不知何故在附近。我無法提供關於你應該怎麼做的建議。試圖分析您的查詢嚇跑了我。 :-(

+0

我認爲這是問題所在。我要繼續探索,看看我能不能得到一個if(!isnull(blah blah))線路來工作。 – ramonecung 2012-04-17 19:53:50

0

看起來好像你在type conversion有問題。在這種情況下,我相信你正在尋找CDate function

+0

我剛試過以下語句在我的where子句中仍然不匹配: CDate(Trim(Left([bc_TestingTickets]。[notes],InStr([bc_TestingTickets]。[notes],''))))>#4/1/2012# CDate([(bc_TestingTickets]。[notes],InStr [[bc_TestingTickets]。[notes],''))))> CDate(「4/1/2012」) CDate(DateValue修剪(左([bc_TestingTickets]。[筆記],InStr([bc_TestingTickets]。[筆記],'')))))#2012年4月1日# 我試過所有各種組合, CDate函數看起來像我應該使用的,但不知道它爲什麼仍在拋出錯誤。 – ramonecung 2012-04-12 20:52:35

+0

@ramonecung:你能更新你的帖子嗎?另外,你的代碼是否可以通過sql formatter(http://www.dpriver.com/pp/sqlformat.htm)更新你的文章? - 這會讓我們其他人更容易閱讀。 :) – 2012-04-12 20:56:38

+0

@ramonecung:如果你得到的數據類型不匹配,這意味着你的trim/left函數不是日期時解析出的數據。解決這個問題的一種方法是創建一個簡單的SELECT查詢,試圖在不進行比較的情況下提取日期。從這一點開始,你可以開始使用你的IIF(ISDATE(CDATE(TRIM(Left(邏輯直到你已經達到了清理日期被解析出來的地步), – 2012-04-12 21:01:05

0

問題可能是日期部分的順序。在立即窗口中的測試表明該

 
?cdate(#4/1/2012#) 
01.04.2012 

?cdate(#2012/1/4#) 
04.01.2012 

向後寫入格式yyyy/MM/dd日期,並因此避免日積月累的inadverted交換!

DateValue("2012/1/4") 

CDate(#2012/1/4#) 
相關問題