【问题标题】:Why is datetime handled differently between Delphi XE7 64 bit and 32 bit?为什么 Delphi XE7 64 位和 32 位的日期时间处理方式不同?
【发布时间】: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 而不是.Value 2) 调用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


【解决方案1】:

我没有让 Delphi IDE 为 SQL 参数分配默认类型的宽字符串,而是将类型更改为 ftDateTime。然后代码行变成了:

mftQuery.Parameters.ParamByName('startdate').value := DateToStr(startdatePicker.datetime);
mftQuery.Parameters.ParamByName('enddate').value := DateToStr(enddatePicker.datetime);

感谢 Abelisto 为我指明了新的方向!我没想到要检查参数的类型。

【讨论】:

  • 很高兴看到您解决了问题。祝你好运:)
猜你喜欢
  • 2014-02-05
  • 2011-12-11
  • 2012-09-03
  • 2011-01-28
  • 2017-04-22
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
相关资源
最近更新 更多