3

using Delphi 2010 (Firebird [testing], MS Sql Server, Oracle [production])

The following is my 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;

I am getting a "conversion error from string - 10-25-2012" and i am not sure why, since my datetime fields are in the "10/25/2012 9:20:49 AM" format in the database.

If i change it to the following : ParamByName('beginDateRange').AsString := formatDateTime('mm/dd/yyyy',Date - 30).....i get the error "conversion error from string - 10/25/2012"

reserching this error has provided me no new avenues, do you have any ideas?

4

4 回答 4

5

根据 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)

条件(Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange)是:

CAST(p.start_time AS DATE) BETWEEN :beginDateRange AND :endDateRange
于 2012-10-26T10:28:17.537 回答
2

如果字符串是 12 小时格式,Firebird 不支持从字符串到日期和时间值的转换。使用 'dd.mm.yyyy hh:mm:ss' 或 'mm/dd/yyyy hh:mm:ss' 格式。

于 2012-10-25T15:44:22.323 回答
0

字符串到日期/时间的转换通常使用用户的语言环境。因此,如果您使用与您的语言环境的日期部分不匹配的字符串提供日期/时间转换函数 - 您将收到类似的错误。

此外,指定日期/时间值(如“2012 年 10 月 25 日”)取决于区域设置。因此,如果您在不同于美国语言环境(如我的)的计算机上执行程序 - 如果使用“2012 年 10 月 25 日”,它可能会失败。

要独立于语言环境,我建议两个选项:

  • 使用StrToDateTime,指定 TFormatSettings
  • 使用 ISO 8601 指定日期/时间字符串(但我认为 Delphi 不支持...)

顺便说一句,MS Sql、Excel 等程序接受 ISO 8601 中的日期。但你必须检查 FB。

关于这一点:

...因为我的日期时间字段在数据库中采用“10/25/2012 9:20:49 AM”格式...

日期/时间字段的内部存储因不同的数据库引擎而异。您在数据库管理软件中看到的内容(在您的情况下为“10/25/2012 9:20:49 AM”)是数据字段的字符串表示形式,通常(再次)根据您的用户区域设置格式化

于 2012-10-25T16:40:31.470 回答
0

如果您从服务器 Firebird 2.1 下的 Firebird 1.0 连接数据库(例如),您需要在 Firebird 2.1 下进行备份和恢复

于 2019-08-09T16:18:00.107 回答