2016-05-24 2 views
1

Использование 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; 
+0

Какой тип данных является:: FDate? Выполняя прямой SQL, я получаю ожидаемые результаты, пока данные верны. –

+0

@ Тома Х. Я не знаю. Эта конкретная строка была взята из примера где-то. Я безуспешно пытался понять, как использовать FindParam. Я назначаю ему TDateTime, надеясь, что он сможет справиться с этим, и это возможно, если нет фракций. Должно ли быть ценным? – AndersJ

+0

Зачем вам «FindParam» вообще? Используйте 'ParamByName', поскольку вы знаете, что параметр существует. –

ответ

1

Пожалуйста Chech точность примечание для SQL Server datetime and time data types на MSDN

Написано, что: Точность округлена до приращений .000, .003 или .007 секунд

Это означает 23: 59: 59,997 КИ Но 23: 59: 59,998 будет округлен до 23: 59: 59,997 И 23: 59: 59,999 будет округлен до 00:00:00 на следующий день

+0

Я знаю вопросы точности. Десятичные различия между записью, однако, составляют от десятков до сотен мс. – AndersJ

+0

Я не мог выполнить Query.Parameters. Я переписал эту строку, и теперь она: WHERE (Time_Stamp> = CONVERT (DATETIME, '2016-05-24 00: 00: 00.000', 102)) – AndersJ