【发布时间】:2015-10-23 02:27:59
【问题描述】:
我使用 SQL 语句:
select * from manifests where mftDate between :startdate and :enddate
这是使用 ADOQuery、xe7、Windows 7 64 位。这些值是从日期时间选择器中选择的
mftQuery.Parameters.ParamByName('startdate').value := startdatePicker.datetime;
mftQuery.Parameters.ParamByName('enddate').value := enddatePicker.datetime;
当我从 64 位编译器执行此操作时,一切正常。
当我重新编译为 32 位时,它会编译。但是,当我执行时,它会抛出一个错误,即 参数的类型错误。
在 32 位和 64 位版本下如何编码日期?
mftDate 在 MS SQL 2008 中定义为日期,允许为空。
我尝试在日期时间值上使用 DateToStr() 函数。不工作。但是,我编写了一个现在似乎可以工作的例程:
function TForm1.fixDate(myDate : TDateTime) : string;
var myYear, myMonth, myDay : word;
begin
DecodeDate(myDate, myYear, myMonth, myDay);
result := IntToStr(myYear) + '-' + IntToStr(myMonth) + '-' + IntToStr(myDay);
end;
对于我的一生,我不知道为什么会这样!
【问题讨论】:
-
mftDate 是什么类型?
-
没有答案,但有一些解决方法的建议:1) 使用
.AsDateTime而不是.Value2) 调用Parameters.Refresh然后Parameters.ParamByName('foo').DataType := ftDateTime;3) 如果您使用MS SQL (又名 SQL 服务器)尝试在查询中声明变量,如declare @startdate date = :p_startdate;(可能不准确,有一段时间不使用 MS SQL),然后是select * from ttt where ddd = @startdate -
这对您的问题来说是一个糟糕的解决方案。您对此感到满意,还是想正确地做?
-
@David 我猜想看到这是一个问题,他没有关闭它,他想正确地做到这一点。我建议 DateToStr 可能失败的原因是它的字符串日期格式与数据库不匹配。不过,不确定为什么参数设置不起作用。我假设 XXXDatePicker.datetime 是 TDateTime?
-
啊,我没有识别基本组件,因为我已经很久没有使用基本 VCL 组件了。建议进入 .Value 设置器的调试 DCU 并找出 TParam.SetAsVariant 认为值的 VarType 是什么。另一个需要注意的不相关的事情是在带日期的查询之间运行的危险 - 时间组件可能会混淆事情
标签: sql delphi datetime 32bit-64bit