2012-10-24 41 views
0

我使用delphi 2010和Firebird(本地)进行测试,但最终将运行我的应用程序对MS Sql Server或Oracle。根据开始和结束日期时间字段选择记录

如果我有日期时间字段(start_time & end_time),并且我想选择过去30天或日期的所有记录,我如何做到这一点,考虑到上面提到的三个数据库(firebird ,SQL服务器,Oracle)

示例日期时间字段看起来像这样:2012年10月15日上午9点二十零分49秒

以下是其中我想添加额外的where子句的示例SQL语句到:

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. 如何从starttime或endtime在最近30天内的阶段中选择所有记录?

  2. 如何选择一个阶段那里开始时间或结束时间坠落日期范围 内(可以说,例如,我使用的PARAMS:beginDateRange &:endDateRange)的所有记录

感谢名单为您的帮助

+0

不会它的工作就像整数? '(column_date <:endDateRange)和(column_date> =:beginDateRange)'?而对于“最后30”,你只需设置beginRange并省略endRange的条件 –

+0

对于“最后30”,你可以使用'datediff(从current_date到日期的日期)(尽管它可能只是Firebird)构建:http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-datediff.html –

回答

1

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

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

这应该跨越不同的数据库 - 例如,如果他们宣布在火鸟时间戳和日期在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; 

火鸟和Oracle将处理有关SQL Server语法之间但不知道(但据推测它)。在这种情况下,你可以在条款更改为类似:

and Trunc(p.start_time) between :beginDateRange and :endDateRange 
+0

你似乎错过了这个词:date1和date2之间。请参阅http://firebirdsql.su/doku.php?id=select –

+0

@Arioch' - yep ...我会更新 – Jason

+0

我收到“从字符串转换错误 - 2012年10月25日”,我是不知道为什么,因为我的日期时间字段是“2012年10月25日9:20:49 AM”格式。它可能是日期功能? –

0

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

而不是adotable.BOF做

........ 还有很多其他的方法和更好的方法,如果使用的是Oracle特殊。 由于adotable不会是

+0

Rudi,也许我弄错了,但你不是建议排序和获取从数据库到客户端的所有记录?如果是这样,我希望你永远不会在商业应用中做这样的事情:-) – TLama

+0

@TLama“过去30天”,这可能是完全有效的建议,假设表没有来自“未来”的行。然而,对于“在date1和date2之间”这是可怕的,我同意。 –

+0

我知道数据可以从客户端检索,如果检索和变得脆弱......但正如我所说,如果它排序,那么你只能检索字段长达30天,而没有触及任何其他领域......运行SQL中循环一旦排序,则只能检索相关数据。如果你排序你的领域,使用参数,并不将检索到的数据存储在客户端设置它将是安全的 – Rudi

相关问题