MS Access 和 SQL 服务器之间的 Max() 行为不同
Posted
技术标签:
【中文标题】MS Access 和 SQL 服务器之间的 Max() 行为不同【英文标题】:Max() Behavior Different Between MS Access and SQL server 【发布时间】:2011-12-14 03:42:34 【问题描述】:所以我正在将 MS Access 应用程序重写为 SQL Server 后端。我在 Access 使用 MAX()
的方式以及 SQL Server 的执行方式中遇到了一些不寻常的行为。也许是睡眠不足,但我已经盯着这个看了好几个小时,我不明白为什么 SQL 服务器的结果不同。
样本数据:
Acct ByUser TranType TranID AddID ClearTime TranTime
12345678 CZ12 W 55545124 CZ36 12/12/2011 9:45:31 AM 12/12/2011 9:45:31 AM
12345678 CZ24 W 55545124 CZ36 12/12/2011 10:01:26 AM 12/12/2011 10:01:26 AM
12345678 CZ36 W 55545124 CZ36 12/12/2011 9:45:31 AM 12/12/2011 9:45:31 AM
12345678 MG12 W 55545124 CZ36 12/12/2011 10:48:43 AM 12/12/2011 10:48:43 AM
12345678 CZ25 W 55545124 CZ36 12/12/2011 9:45:31 AM 12/12/2011 9:45:31 AM
MS Access 查询:
SELECT Acct, TypeID, TranType
, Max(TranTime) AS MaxOfTranTime
, AddID
, Max(ClearTime) AS MaxOfClearTime
FROM Cleared
WHERE
(
((ByUser) Like "CZ*" Or (ByUser) Like "TR*" Or
(ByUser) Like "RR*" Or (ByUser) Like "MG*" Or
(ByUser) Like "RN*" Or (ByUser) Like "PS*" Or
(ByUser) Like "OP*" Or (ByUser) Like "JA*" Or
(ByUser) Like "IC*" Or (ByUser) Like "IB*" Or
(ByUser) Like "FO*" Or (ByUser) Like "DV*" Or
(ByUser) Like "CD*" Or (ByUser) Like "BO*" Or
(ByUser) Like "2D*")
)
GROUP BY Acct, TypeID, TranType, AddID
访问结果:
Account TranID TranType MaxOfTranTime AddID MaxOfClearTime
12345678 55545124 W 12/12/2011 10:48:43 AM CZ36 12/12/2011 9:45:31 AM
SQL Server 中的查询略有不同,因为我的 ByUser 存储在一个表中,以尽量减少输入大量查询。
SELECT C.Acct
, C.RequestId
, C.TypeCode
, Max(C.TranTime) as MaxTranTime
, C.AddUserId
, Max(C.ClearDate) As MaxClearDate
FROM Cleared C
WHERE EXISTS (SELECT *
FROM UserIdFilter U
WHERE ByUserId LIKE U.UserId)
GROUP BY Acct, RequestId, TypeCode, AddUserId
SQL Server 结果是:
Account TranID TranType MaxOfTranTime AddID MaxOfClearTime
12345678 55545124 W 12/12/2011 10:48:43 AM CZ36 12/12/2011 10:48:43 AM
当我经历这个时,在我看来 SQL 服务器在获取 12/12/2011 10:48:43 AM 的 MaxOfClearTime 是正确的,但我错过了什么吗? Access 处理MAX()
是否不同?我觉得我正在为此失去理智,所以任何其他人对此的看法都会很棒。
【问题讨论】:
似乎第一次你使用 'Max(ClearTime) AS MaxOfClearTime' 而第二次你使用 'Max(C.ClearDate) As MaxReasClearDate' @ysrb 他们是一样的,我只是把它复制错了,查询、数据在发布到任何网站之前都需要清理。我改正了 运行“SELECT * FROM UserIdFilter U WHERE ByUserId LIKE U.UserId”是否会为您提供与第一个查询中相同的值?? @MitchWheat 是的,我在第一个查询中得到了相同的值。完全相同的记录数等。 【参考方案1】:我将您提供的数据放入 Access 并运行查询,它提供了我期望的输出,即 10 > 9
。
当然,我确实假设 ClearTime 和 TranTime 都存储为 DateTime,如果我将它们更改为 Text 并更改格式以匹配您的示例,那么我会得到与您相同的结果,即 "9" > "10"
。
您能在 MS Access 中检查表的架构吗?
【讨论】:
这为我指明了正确的方向。它是访问中的文本字段,而不是日期字段。以上是关于MS Access 和 SQL 服务器之间的 Max() 行为不同的主要内容,如果未能解决你的问题,请参考以下文章
重新定义 MS Access 文件和 SQL Server 之间的数据链接
从 MS SQL SERVER 和 MS ACCESS 调用存储过程的结果之间的差异
在 MS Access 或 SQL Server 中查找 2 个表之间的差异
在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异