1

我有以下查询;

Select count(*) as poor
from records where deviceId='00019' and type='Poor' and timestamp between #14-Sep-2012 01:01:01# and #24-Sep-2012 01:01:01#

桌子就像;ID。deviceId、类型、时间戳

数据就像;

数据就像;

1, '00019', 'Poor', '19-Sep-2012 01:01:01'
2, '00019', 'Poor', '19-Sep-2012 01:01:01'
3, '00019', 'Poor', '19-Sep-2012 01:01:01'
4, '00019', 'Poor', '19-Sep-2012 01:01:01'

我正在尝试计算具有特定特定类型的设备。

请帮助..访问总是返回错误的数据。它返回 1 而 00019 有 4 个穷人条目

4

2 回答 2

2

类型和时间戳都是保留字,因此请在查询中将它们括在方括号中,如下所示:[type][timestamp]. 我怀疑这些保留字是您问题的原因,但是很难准确预测保留字何时会导致查询问题,因此只需使用方括号排除这种可能性。

除此之外,存储的文本值有时包含额外的不可见字符。检查存储的文本值的长度以查看是否有任何比预期的长。

SELECT
    Len(deviceId) AS LenOfDeviceId,
    Len([type]) AS LenOfType,
    Len([timestamp]) AS LenOfTimestamp
FROM records;

在评论中,您在存储值中提到了空格(ASCII 值 32)。我一直认为我们正在处理其他不可打印/不可见的字符。如果在存储deviceId值的开头和/或结尾有一个或多个实际空格字符,该Trim()函数将丢弃它们。因此,此查询将在两列中为您提供不同的长度数字:

SELECT
    Len(deviceId) AS LenOfDeviceId,
    Len(Trim(deviceId)) AS LenOfDeviceId_NoSpaces
FROM records;

如果存储的值可以在字符串中包含空格(不仅仅是在开头和/或结尾处),Trim()则不会删除那些。在这种情况下,您可以使用该Replace()函数丢弃所有空格。但是请注意,使用的查询Replace()必须在 Access 应用程序会话中运行——您不能从 Java 代码中使用它。

SELECT
    Len(deviceId) AS LenOfDeviceId,
    Len(Replace(deviceId, ' ', '')) AS LenOfDeviceId_NoSpaces
FROM records;

如果该查询在两列中返回相同长度的数字,那么我们处理的不是实际的空格字符(ASCII 值 32)……而是一些看起来“类似空格”的其他类型的字符。

于 2012-09-24T16:12:31.593 回答
0

如果您想计算具有特定类型的设备而不考虑设备 ID,请使用以下命令:

Select count(*) as excellent
from records where type='Poor'

如果您想计算具有特定设备 ID 的设备而不考虑类型,请使用以下命令:

Select count(*) as excellent
from records where deviceId='00019'
于 2012-09-24T07:18:55.250 回答