我正在使用delphi 2010和Firebird(本地)进行测试,但最终将针对MS Sql Server或Oracle运行我的应用程序。
如果我有datetime字段(start_time& end_time),并且我想要选择过去30天或日期的所有记录,我该怎么做,考虑到上面提到的三个数据库(firebird) ,sql server,oracle)
示例日期时间字段如下所示: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';
如何从开始时间或结束时间在过去30天内的阶段中选择所有记录?
如何从开始时间或结束时间落在某个日期范围内的阶段中选择所有记录 (比方说,我使用params:beginDateRange&:endDateRange)
thanx求助
答案 0 :(得分: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将处理之间的语法,但不确定SQL Server(但可能是这样)。在这种情况下,您可以将和子句更改为:
and Trunc(p.start_time) between :beginDateRange and :endDateRange
答案 1 :(得分:0)
确保根据日期和时间对数据库进行排序,然后您可以运行循环来查找日期大于31的第一个条目。然后您知道可以从该字段索引编号循环向上... 。使用adotable剪切第一个循环。在检索所有数据时,在while循环中添加sql。
虽然没有adotable.BOF做
........ 如果使用oracle,还有很多其他方法和更好的方法。 只有采用背后的概念和逻辑,因为可以通过