mva*_*lla 3 sql-server delphi datetime date delphi-xe
我搜索谷歌和SO没有可用的修复程序.我正在date
从SQL Server中的表中检索一个.我需要将它转换为DateTime
Delphi中的对象.问题似乎在于来自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相同
可能的解决方案:
Provider=SQLNCLI10.1;
- > date
映射到TDateField
SELECT
通过CAST(ActiveDate AS datetime)
然后.AsDateTime
按预期工作.datetime
在SQL-Server上使用数据类型而不是date
date
领域感谢 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)