2012-10-24 44 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

相關問題