Blo*_*mUp 3 delphi firebird delphi-2010
使用Delphi 2010(Firebird [测试],MS Sql Server,Oracle [生产])
以下是我的SQL
SELECT p.script_no, MIN(p.start_Time) as startTime, MAX(p.end_Time) as endTime, 
SUM(p.duration) as TotalDuration
FROM phase_times p
WHERE (p.script_no=:scriptNo) AND (Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange) 
GROUP BY p.script_no
ParamByName('beginDateRange').AsDate:= Date - 30;
ParamByName('endDateRange').AsDate:= Date;
Run Code Online (Sandbox Code Playgroud)
我收到"字符串转换错误 - 10-25-2012",我不知道为什么,因为我的datetime字段在数据库中的"10/25/2012 9:20:49 AM"格式.
如果我将其更改为以下:ParamByName('beginDateRange').AsString:= formatDateTime('mm/dd/yyyy',Date - 30).....我收到错误"字符串转换错误 - 10/25/2012"
研究这个错误并没有为我提供新的途径,你有什么想法吗?
根据Interbase 6.0手册,嵌入式SQL指南,第7章,Firebird支持YYYY-MM-DD和YYYY-MM-DD HH:MM:SS.qqq的转换.我也相信它支持美国风格的速记日期(例如1-JAN-2012)进行转换.
它可能是支持某些与语言环境相关的转换,但通常:使用实际的日期/时间戳类型而不是字符串.
更新 
我最初没有TRUNC在您的查询中发现:它是转换错误的原因,因为此函数仅适用于数字,请参阅TRUNC的手册条目.
鉴于你的评论(以及ain的回应)我假设你只对日期部分感兴趣,并且想要忽略时间.如果是这样,请重写您的使用TRUNC:
CAST(<your-timestamp-field> AS DATE)
Run Code Online (Sandbox Code Playgroud)
条件(Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange)是:
CAST(p.start_time AS DATE) BETWEEN :beginDateRange AND :endDateRange
Run Code Online (Sandbox Code Playgroud)