1

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

到目前为止,我一切正常,但是当我尝试将表达式添加到 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),与选择中的第二列不同。

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

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

4

3 回答 3

0

看来您的类型转换有问题。在这种情况下,我相信您正在寻找CDate 功能

于 2012-04-12T20:44:18.260 回答
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#)
于 2012-04-12T21:41:52.777 回答
0

您报告此 WHERE 子句出现数据类型不匹配错误。

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

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

如果 Nulls 存在,您的情况可能类似于这个简单的查询,它也会触发数据类型不匹配错误:

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

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

于 2012-04-13T18:00:45.343 回答