我在比较访问数据库中的日期时遇到了问题。基本上我是从文本字段中解析出一个日期,然后尝试将该日期与另一个日期进行比较,以便只提取更新/更旧的记录。
到目前为止,我已经完成了所有工作,但是当我尝试将表达式添加到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结果的屏幕截图的链接。一张图片中有两个截图。
答案 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,' '))));
如果这证明是您的问题的原因,您将不得不以某种方式围绕它进行设计。我不能就你应该怎么做提出建议。试图分析你的查询吓跑了我。 : - (