在Delphi XE中从SQL Date转换为DateTime

mva*_*lla 3 sql-server delphi datetime date delphi-xe

我搜索谷歌和SO没有可用的修复程序.我正在date从SQL Server中的表中检索一个.我需要将它转换为DateTimeDelphi中的对象.问题似乎在于来自SQL的价值.我正在测试它的SQL Server版本是SQL Server 2012(而不是R2).

如果我将查询中检索到的值显示为字符串,我得到:

myQuery.FieldByName('ActiveDate').AsString;
Run Code Online (Sandbox Code Playgroud)

我得到了价值

2014-06-15
Run Code Online (Sandbox Code Playgroud)

myQuery 是TADOQuery类型.

DateTime似乎不喜欢这种格式,因为所有这些都失败了:

myQuery.FieldByName('ActiveDate').AsDateTime;
StrToDateTime(myQuery.FieldByName('ActiveDate').AsString);
StrToDate(myQuery.FieldByName('ActiveDate').AsString);
Run Code Online (Sandbox Code Playgroud)

记录的捕获异常的失败消息是:

''2014-06-15'' is not a valid date and time
Run Code Online (Sandbox Code Playgroud)

有没有一个解决方案,不涉及复杂的字符串操作,不会受到服务器的语言环境的影响?

kob*_*bik 13

我可以重现这种行为(SQL Server 2008 R2).
SQL-Server数据类型date(2008+ )使用ADO提供程序映射到TWideStringField(ftWideString)SQLOLEDB.1.

访问此字段(TWideStringField).AsDateTime将引发异常,如问题中所述: '2014-06-15' is not a valid date and time.

这是一个相关(或重复?)的问题: Delphi 6,ADO,MS数据库"Date"字段与ftWideString相同

可能的解决方案:

  • 使用SQL-Server本机客户端,例如Provider=SQLNCLI10.1;- > date映射到TDateField
  • SELECT通过CAST(ActiveDate AS datetime)然后.AsDateTime按预期工作.
  • datetime在SQL-Server上使用数据类型而不是date
  • 通过@Chris Thornton提供的解决方案进入该date领域


Chr*_*ton 5

感谢 David 和 Remy 的反馈,这里有一个应该可以解决问题的函数:

function AnsiDateStrToDate(AnsiDate : string) : TDate;
// Convert data in YYYY-MM-DD to TDate
var
  Fmt : TFormatSettings; // Does not need to be freed
begin
  Fmt := TFormatSettings.Create;
  Fmt.ShortDateFormat := 'YYYY-MM-DD';
  Fmt.DateSeparator := '-';
  result := StrToDate(AnsiDate,Fmt);
end;
Run Code Online (Sandbox Code Playgroud)

用法:

if AnsiDateStrToDate(myQuery.FieldByName('ActiveDate').AsString) = Date Then
  writeln('Today!')
Else
  writeln('Not Today!);
Run Code Online (Sandbox Code Playgroud)

  • 如果必须这样做,请使用不依赖于全局状态的转换函数。接受格式设置参数的重载。但肯定最好避免转换为字符串。 (2认同)
  • 我已经确定了答案。 (2认同)