比较Access中的日期值 - 标准表达式中的数据类型不匹配

时间:2012-04-12 20:00:03

标签: sql ms-access date

我在比较访问数据库中的日期时遇到了问题。基本上我是从文本字段中解析出一个日期,然后尝试将该日期与另一个日期进行比较,以便只提取更新/更旧的记录。

到目前为止,我已经完成了所有工作,但是当我尝试将表达式添加到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函数,但我仍然遇到不匹配错误:

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

有关如何比较此方法中的日期的任何提示?我无法更改数据库中的任何字段,等等,这就是我在SQL中解析日期并尝试操作它以便我可以针对它运行报告的原因。

我试过谷歌搜索,但没有具体谈论从文本解析日期并将其转换为日期对象。我认为它可能是一个错误或从左/修剪函数返回日期的方式。你可以看到我在SELECT语句的末尾添加了一个名为DateTest的列,显然访问将其视为日期(当查询运行时,它要求按最旧到最新/最新到最旧而不是AZ排序或ZA),与select中的第二列不同。

提前感谢有关我如何根据日期查询的任何提示/线索。

编辑: 我刚刚在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结果的屏幕截图的链接。一张图片中有两个截图。

3 个答案:

答案 0 :(得分:0)

您似乎遇到了type conversion的问题。在这种情况下,我相信您正在寻找CDate function

答案 1 :(得分:0)

问题可能是日期部分的顺序。立即窗口中的测试显示此

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

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

yyyy/MM/dd格式向后写日期,从而避免无意中交换日期和月份!

DateValue("2012/1/4")

CDate(#2012/1/4#)

答案 2 :(得分:0)

您报告了此WHERE子句导致数据类型不匹配错误。

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

这让我想知道[bc_TestingTickets].[notes]是否可以为空,因为表设计允许Null用于该字段,或者Null被设计禁止但是存在于查询的候选行集中作为结果左或右加入。

如果存在Null,则您的情况可能类似于此简单查询,该查询也会触发数据类型不匹配错误:

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

如果这证明是您的问题的原因,您将不得不以某种方式围绕它进行设计。我不能就你应该怎么做提出建议。试图分析你的查询吓跑了我。 : - (