我有一个查询,它的选择基于日期字段。问题是该日期字段有时为空,因此仅使用“而不是空”检查是否为空是行不通的。
这是我开发的:
SELECT DISTINCT WS_ALL_OBJ.[Owner ID], Users.CHARGE_UNIT, WS_ALL_OBJ.[Owner Name]
FROM WS_ALL_OBJ LEFT JOIN Users ON WS_ALL_OBJ.[Owner ID] = Users.CNAME
WHERE
(IIF(IsNull(WS_ALL_OBJ.[Last Modified]), DateValue('2050-12-01'), DateValue(Left(WS_ALL_OBJ.[Last Modified], 10))) < #2012-11-26#
And
(Users.CHARGE_UNIT <> 'CQ'))
GROUP BY WS_ALL_OBJ.[Owner ID], Users.CHARGE_UNIT, WS_ALL_OBJ.[Owner Name];
运行此查询时,它会引发“标准表达式中的数据类型不匹配”错误消息。
我已经把它缩小到这行代码——DateValue(Left(WS_ALL_OBJ.[Last Modified], 10))
因为如果我替换它DateValue('2011-11-26')
——它工作得很好。
起初我以为是因为我的字段中有空值,Last Modified
这就是我想出这个的原因 -(IIF(IsNull(WS_ALL_OBJ.[Last Modified]), DateValue('2050-12-01'), DateValue(Left(WS_ALL_OBJ.[Last Modified], 10))) < #2012-11-26#
那不应该解决空值问题吗?
另一种可能性是来自的字符串Left()
格式不正确。我认为这是因为这个 - DateValue('2011-11026')
- (格式错误)也会通过 Data Type Mismatch 异常。
然而,这就是所有数据的样子:
2008-01-18 13:10:54 CST
它存储为“文本”字段,来自链接的 csv 文件。该Left()
函数应采用前 10 个字符并传递给DateValue()
我很茫然,感谢任何帮助。
更新:我也试过cdate(Left(WS_ALL_OBJ.[Last Modified], 10))
并得到同样的错误。我还修改为使用 `(IsNull(WS_ALL_OBJ.[Last Modified]) 或 WS_ALL_OBJ.[Last Modified] = '') 检查空字符串
我最终运行了一些查询,以确保不存在WS_ALL_OBJ.[Last Modified] = ''
或WS_ALL_OBJ.[Last Modified] = ' '
类似的存在。他们都返回零结果。
我也尝试了下面建议的查询结构,但无济于事。