Использование Delphi 6 и Microsoft SQL Server 2000.Почему «WHERE (Time_Stamp> = TDateTime-variable)» игнорирует дробные секунды?
Мне нужно извлечь записи, где поле TDateTime - это пройденное TDateTime, FromDate.
Это не так, как если бы дробная часть секунд прошедшего TDateTime всегда была равна нулю.
Отладочные распечатки подтверждают, что существуют фракции.
Часть WHERE игнорирует часть доли: Fdate.
Предположим, следующие 3 записи:
Запись 1: Time_Stamp составляет 1,2
Запись 2: Time_Stamp составляет 1,4
записать 3: Time_Stamp 1,6
Значение 1.3 затем отправляется запрос в: Fdate.
Результирующий набор данных возвращает ВСЕ 3 записи.
Я ожидал только записей 2 и 3, так как 1.3> 1.2
Поле «Time_Stamp» в базе данных является полем «datetime» SQL.
Все работает отлично для целых секунд,
например, одна запись в секунду или реже, когда десятичная дробь не имеет значения.
Может ли кто-нибудь указать, где моя ошибка?
Оператор SQL генерируется с помощью кода (как показано ниже) следующим образом:
SELECT TOP 6 * FROM T_TransactionLog
INNER JOIN T_LookUp_TransTypes
ON T_TransactionLog.TransType = T_LookUp_TransTypes.TransType
WHERE (Time_Stamp >= :Fdate)
AND T_TransactionLog.TransType IN (
3,
4,
5
)
AND LockerNo < 60001
ORDER BY Time_Stamp ASC
Код выглядит следующим образом:
Query.Connection := Sys_DB_Form.ADOConnection;
DataSource.DataSet := Query;
Query.SQL.Add('SELECT TOP ' + IntToStr(cNoTransactions) + ' * FROM
T_TransactionLog');
Query.SQL.Add('INNER JOIN T_LookUp_TransTypes');
Query.SQL.Add('ON T_TransactionLog.TransType =
T_LookUp_TransTypes.TransType');
Query.SQL.Add('WHERE (Time_Stamp ' + S_Condition + ' :Fdate)');
Query.SQL.Add('AND T_TransactionLog.TransType IN (');
Query.SQL.Add(IntToStr(ord(Apl_TrLog.ttEA)) + ',');
Query.SQL.Add(IntToStr(ord(Apl_TrLog.ttMO)) + ',');
Query.SQL.Add(IntToStr(ord(Apl_TrLog.ttMC)));
Query.SQL.Add(')');
Query.SQL.Add('AND LockerNo < ' +
IntToStr(Apl_Config.cLNoOfFirstgate));
if Locker <> 0 then
begin
Query.SQL.Add('AND LockerNo = ' + IntToStr(Locker));
end;
Query.SQL.Add(S_OrderBy);
Query.Parameters.FindParam('Fdate').Value := FromDate; // <<< Fail????
Query.SQL.SaveToFile(GetApplicationDataPath + 'Sql.txt');
try
Query.Open;
except
ShowMessage('Query open fail on ME Show Transaction log');
end;
Какой тип данных является:: FDate? Выполняя прямой SQL, я получаю ожидаемые результаты, пока данные верны. –
@ Тома Х. Я не знаю. Эта конкретная строка была взята из примера где-то. Я безуспешно пытался понять, как использовать FindParam. Я назначаю ему TDateTime, надеясь, что он сможет справиться с этим, и это возможно, если нет фракций. Должно ли быть ценным? – AndersJ
Зачем вам «FindParam» вообще? Используйте 'ParamByName', поскольку вы знаете, что параметр существует. –