我正在处理一个sql语句,在该语句中,我试图获取小于或等于开发日期的所有项目。但是,我收到了一个错误
“标准表达式中的数据类型不匹配”
我搜过又搜过,但什么也找不到。
原始结果看起来类似于以下内容:
| Title | devTerm | pilotTerm |
+-------+---------+-----------+
| Ex1 | 201401 | 201404 |
| Ex2 | 201301 | 201401 |
| Ex3 | 201504 | 201601 |
以下是我的查询:
SELECT *
FROM projects
WHERE Len(devTerm)>0
AND Len(pilotTerm)>0
AND Date() >= CDate(DateSerial(Left(devTerm,4),Right(devTerm,2),1))
我做错了什么?
附注:如果我没有必要的话我就不会使用访问权限了。
我引用本文:Convert Text to date
截图:
发布于 2015-02-04 16:23:20
好吧,我解决了这个问题。从我问题下的评论中,我能够想到Nz()函数。最后的查询如下所示
SELECT *
FROM projects
WHERE Date() >= DateSerial(Left(Nz(devTerm, "1990"),4),Right(Nz(devTerm, "01"),2), 1)
AND Date() < DateSerial(Left(Nz(pilotTerm, "1990"),4),Right(Nz(pilotTerm, "01"),2), 1)
pilotTerm和devTerm把NULLs扔出去了,这就是问题的所在。我以为Access SQL会用
Len(devTerm)>0
AND Len(pilotTerm)>0
发布于 2015-02-04 16:14:25
到目前为止,我能够重新创建这个问题的唯一方法是快速测试功能,看看它可能是什么可能性。因此,我觉得必须有一个空白或无效的记录,重新创建这个记录的函数如下:
Public Function Test()
If Date >= DateSerial(Left("201401", 4), Right("201401", 2), 1) Then
MsgBox DateSerial(Left("", 4), Right("", 2), 1)
End If
End Function
它进入if语句,然后以类型不匹配的方式中断。因此,空白记录可能会导致此记录或无效记录。
发布于 2015-02-04 16:24:06
显然,这就是Left()
和Right()
由于Null值而无法返回正确值的问题。你可以用这个,
SELECT
*
FROM
projects
WHERE
DateSerial(Left(Nz([devTerm], 205812), 4), Right(Nz([devTerm], 205812), 2), 1) <= Date()
Nz()将考虑到它们具有空值的事实,并在未来创建一个总是大于Date()的日期。
https://stackoverflow.com/questions/28325496
复制相似问题