Sql 访问日期比较错误
我正在编写一个sql语句,试图获取所有小于或等于开发日期的项目。然而,我得到了一个错误 条件表达式中的数据类型不匹配 我找了又找,但什么也没找到 原始结果与此类似:Sql 访问日期比较错误,sql,date,ms-access,ms-access-2013,Sql,Date,Ms Access,Ms Access 2013,我正在编写一个sql语句,试图获取所有小于或等于开发日期的项目。然而,我得到了一个错误 条件表达式中的数据类型不匹配 我找了又找,但什么也没找到 原始结果与此类似: | Title | devTerm | pilotTerm | +-------+---------+-----------+ | Ex1 | 201401 | 201404 | | Ex2 | 201301 | 201401 | | Ex3 | 201504 | 201601 | 我的问题是:
| 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))
我做错了什么
p、 如果没有必要,我就不会使用Access
我引用这篇文章:
截图:
到目前为止,我能够重现这个问题的唯一方法是制作一个快速测试函数,看看它可能是什么。因此,我觉得必须有一个空白或无效的记录,重新创建该记录的函数如下所示:
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语句,然后因类型不匹配而中断。因此,可能是空白记录导致了这种情况或无效记录 好的,我解决了问题。从我的问题下的评论中,我能够思考新西兰的职能。最后的查询如下所示
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)
很明显,这就是由于空值导致Left和Right无法返回Right值的问题。你可以用这个
SELECT
*
FROM
projects
WHERE
DateSerial(Left(Nz([devTerm], 205812), 4), Right(Nz([devTerm], 205812), 2), 1) <= Date()
新西兰将考虑到他们有空值的事实,并在未来创建一个日期,该日期将始终大于日期您的列是什么数据类型?如果devTerm和pilotTerm不是文本,则可能抛出错误。它们都是文本shorttext@Ditto如果不是文本,他们为什么会抛出错误?在我的即时窗口中,我测试了MsgBox CDateDateSerialLeft201401,4,Right201401,2,1和MsgBox CDateDateSerialLeft201401,4,Right201401,2,1都有效。@newd不确定是否会隐式转换它们。Chase:为什么使用CDATE将DateSerial的返回转换为日期?这已经是一个约会了吗?@没错,说得好,我只是把它放在那里试一下,但我忘了在发布之前把它拔下来。
SELECT
*
FROM
projects
WHERE
DateSerial(Left(Nz([devTerm], 205812), 4), Right(Nz([devTerm], 205812), 2), 1) <= Date()