Максимальное () различное поведение MS Access и SQL-сервера - PullRequest
0 голосов
/ 14 декабря 2011

Итак, я переписываю приложение MS Access на сервер SQL. Я борюсь с некоторым необычным поведением в том, как 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-сервере немного отличается тем, что мои пользователи ByUsers хранятся в таблице, чтобы минимизировать ввод в тоннах запросов.

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-сервер правильно получает MaxOfClearTime от 12.12.2011 10:48:43, но я что-то упустил? Access обрабатывает MAX() по-другому? Я чувствую, что схожу с ума с этим, поэтому любые другие взгляды на это было бы здорово.

1 Ответ

1 голос
/ 23 декабря 2011

Я поместил данные, которые вы указали в Access, и выполнил запрос, и он предоставил ожидаемый результат, т.е. 10 > 9.

Конечно, я предполагал, что и ClearTime, и TranTime хранятся как DateTime. Если я изменю их на Text и изменю форматирование в соответствии с вашим образцом, то получу те же результаты, что и вы, то есть "9" > "10".

Не могли бы вы проверить схему таблицы в MS Access?

...