我正在编写一个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))
我做错了什么?
P.S。如果我没有必要,我就不会使用Access。
我引用了这篇文章:Convert Text to date
截图:
答案 0 :(得分:0)
到目前为止,我能够重新创建此问题的唯一方法是通过快速测试功能来查看它可能存在的可能性。从这里我觉得必须有一个空白或无效的记录,重新创建它的功能如下:
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语句,然后因类型不匹配而中断。因此,空白记录可能会导致此记录或无效记录。
答案 1 :(得分:0)
好的,我发现了这个问题。根据我的问题中的评论,我能够考虑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
答案 2 :(得分:0)
这显然是Left()
和Right()
由于 Null 值而未能返回正确值的问题。你可以用这个,
SELECT
*
FROM
projects
WHERE
DateSerial(Left(Nz([devTerm], 205812), 4), Right(Nz([devTerm], 205812), 2), 1) <= Date()
Nz()将考虑他们拥有Null值并在未来创建一个日期方式,这将永远比Date()
更高