0

我正在使用 delphi 2010 和 Firebird(本地)进行测试,但最终将针对 MS Sql Server 或 Oracle 运行我的应用程序。

如果我有日期时间字段(开始时间和结束时间),并且我想选择过去 30 天的所有记录,或者一系列日期,我该怎么做,考虑到上面提到的三个数据库(firebird、sql server、甲骨文)

示例日期时间字段如下所示:10/15/2012 9:20:49 AM

以下是一个示例 sql 语句,我想在其中添加一个额外的 where 子句:

  SQL.Text:= 
      'SELECT J.id, MIN(p.start_Time) as startTime, MAX(p.end_Time) as endTime, ' 
      +  'SUM(p.duration) as TotalDuration ' 
      + 'FROM phases p ' 
      + 'JOIN jobs j ON j.id = p.jobs_Id ' 
      + 'WHERE j.id=:jobId ' 
      + 'GROUP BY j.id';
  1. 如何从开始时间或结束时间在过去 30 天内的阶段中选择所有记录?

  2. 如何从开始时间或结束时间在某个日期范围内的阶段中选择所有记录(例如,我正在使用参数:beginDateRange & :endDateRange)

谢谢你的帮助

4

2 回答 2

1

如果您的列(start_time 和 end_time)被声明为相应 DB 的适当日期类型,您应该能够简单地使用 AsDateTime 函数设置参数。

Query1.ParamByName('start_time').AsDateTime := Date-30
Query1.ParamByName('end_time').AsDateTime := Date;

这应该适用于不同的数据库——例如,如果它们在 Firebird 中声明为时间戳,在 Oracle 中声明为日期。根据您构建查询的方式,您可以使用相同的 SQL 语句,并根据结果集的要求设置 start_time 和 end_times。根据您实际要检索的内容,以下内容应根据 start_time 返回最近 30 天的记录。

例如:

SQL.Text:= 
      'SELECT J.id, MIN(p.start_Time) as startTime, MAX(p.end_Time) as endTime, ' 
      +  'SUM(p.duration) as TotalDuration ' 
      + 'FROM phases p ' 
      + 'JOIN jobs j ON j.id = p.jobs_Id ' 
      + 'WHERE j.id=:jobId '
      + '  and Trunc(p.start_time) >= :beginDateRange and Trunc(p.start_time) <= :endDateRange '
      + 'GROUP BY j.id';
ParamByName('beginDateRange').AsDateTime := Date - 30;
ParamByName('endDateRange').AsDateTime := Date;

Firebird 和 Oracle 将处理between语法,但不确定 SQL Server(但可能会处理)。在这种情况下,您可以将and子句更改为:

and Trunc(p.start_time) between :beginDateRange and :endDateRange
于 2012-10-25T04:17:32.710 回答
0

确保数据库是根据日期和时间排序的,然后你可以运行一个循环来找到日期超过 31 的第一个条目。然后你知道你可以从那个字段索引号向上循环....切掉第一个循环使用 adotable。当它检索所有数据时,在while循环中添加sql。

虽然不可爱。BOF 做

........还有很多其他方法和更好的方法,特别是如果使用 oracle。只考虑这背后的概念和逻辑,因为 adotable 不会

于 2012-10-24T17:56:25.363 回答