为什么“WHERE(Time_Stamp> = TDateTime-variable)”忽略小数秒?

时间:2016-05-24 12:18:27

标签: sql sql-server delphi sql-server-2000

使用Delphi 6和Microsoft SQL Server 2000。

我需要提取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'字段是SQL'datetime'字段 一切都适用于整数秒,
即,当小数部分不重要时,每秒一个记录,或者更少。

有人可以指出我的错误在哪里吗?

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;  

1 个答案:

答案 0 :(得分:1)

请在MSDN上查看SQL Server datetime and time data types的准确性说明

写道: 精度舍入为.000,.003或.007秒的增量

这意味着 23:59:59.997 没关系 但 23:59:59.998 将四舍五入到23:59:59.997 和 23:59:59.999 将在第二天四舍五入到00:00:00