访问日期比较错误
Access Date Comparison Error
我正在编写一个 sql 语句,其中我试图获取所有小于或等于开发日期的项目。但是,我收到一个错误
"Data type mismatch in criteria expression"
我找了又找,还是一无所获。
原始结果类似于:
| 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.s。如果没有必要,我不会使用 Access。
我引用了这篇文章:Convert Text to date
截图:
到目前为止,我能够重现此问题的唯一方法是快速测试函数以查看它的可能性。由此我觉得必须有一条记录是空白或无效的,重新创建它的函数如下:
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 语句,然后因类型不匹配而中断。因此,空白记录可能会导致此记录或无效记录。
好的,我明白了。从我的问题下的评论中,我能够想到 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 抛出 NULL,这就是问题所在。我以为 Access SQL 会用
过滤掉它们
Len(devTerm)>0
AND Len(pilotTerm)>0
嗯,这显然是 Left()
和 Right()
未能 return 正确值的问题,因为 Null 值。你可以用这个,
SELECT
*
FROM
projects
WHERE
DateSerial(Left(Nz([devTerm], 205812), 4), Right(Nz([devTerm], 205812), 2), 1) <= Date()
Nz() 将考虑到它们具有 Null 值这一事实,并在未来创建一个总是比 Date() 更大的日期
我正在编写一个 sql 语句,其中我试图获取所有小于或等于开发日期的项目。但是,我收到一个错误
"Data type mismatch in criteria expression"
我找了又找,还是一无所获。
原始结果类似于:
| 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.s。如果没有必要,我不会使用 Access。
我引用了这篇文章:Convert Text to date
截图:
到目前为止,我能够重现此问题的唯一方法是快速测试函数以查看它的可能性。由此我觉得必须有一条记录是空白或无效的,重新创建它的函数如下:
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 语句,然后因类型不匹配而中断。因此,空白记录可能会导致此记录或无效记录。
好的,我明白了。从我的问题下的评论中,我能够想到 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 抛出 NULL,这就是问题所在。我以为 Access SQL 会用
过滤掉它们Len(devTerm)>0
AND Len(pilotTerm)>0
嗯,这显然是 Left()
和 Right()
未能 return 正确值的问题,因为 Null 值。你可以用这个,
SELECT
*
FROM
projects
WHERE
DateSerial(Left(Nz([devTerm], 205812), 4), Right(Nz([devTerm], 205812), 2), 1) <= Date()
Nz() 将考虑到它们具有 Null 值这一事实,并在未来创建一个总是比 Date() 更大的日期