查询:
SELECT StartDate, EndDate, RIGHT(Sector, 1 )
FROM Table1
ORDER BY Right(Sector, 1), StartDate
通过查看此信息,查询应按扇区排序,然后是开始日期。这个查询已经安静了一段时间,直到昨天没有正确排序,出于某种原因,第2区出现在第1区之前。
Sector的数据类型是int类型,而不是null。将TRIM函数插入Sector之后,它似乎工作正常。
新查询:
SELECT StartDate, EndDate, RIGHT(Sector, 1 )
FROM Table1
ORDER BY Right(TRIM(Sector), 1), StartDate
我觉得这很奇怪,因为它假设只选出一个字符,为什么还有前导空格?
在转换类型之前在int上使用RIGHT函数是否存在问题?还是别的什么?
感谢大家的帮助!
-Edit- RIGHT函数应返回1,2,3或4,但在订购时,2则在1之前。
为了澄清,列Sector包含一个int值,我们可以通过获取最后一位数来确定它的位置(这就是前一个编码器所做的)
答案 0 :(得分:3)
MS Access 2003有一个奇怪的小功能(我不能代言其他版本):
我认为您或其他人可能只是出于好奇心打开了查询,按扇区降序排序,当提示您保存设计更改时,您选择了是(尽管从技术上讲您没有做任何事)。我发现恢复原始排序的最简单方法是编辑查询并保存。
答案 1 :(得分:3)
如果您需要对数字字段的子字符进行排序,则表明您的数据存储错误。
也就是说,在某些上下文中,VBA函数在符号的数字的字符串表示中保留一个空格。一个荒谬的例子是:
?Len("12345")
5
注意开头的空格(如果Len()返回的数字可能为负数,则为 - 。我认为这是将数字强制转换为字符串值的结果,但不是这样,我无法复制问题。但这可能是问题的根源,当然,削减领先空间会解决问题。
但这是每行的两个函数调用,然后你按它排序,这意味着没有使用索引,所以相对于可以使用索引的SORT BY来说它会变慢。所以,我得出结论你有一个模式错误,因为你给字段中存储的数据的子部分赋予了意义。
答案 2 :(得分:1)
看起来非常明显的是,扇区字段的末尾有一个空白区域,即裁剪正在移除。