2016-07-14 25 views
0

我正在使用FastReport和Delphi。我有以下字段:FastReport從Date_From和Date_To字段計算小時數

DATE_FROM (example: 01.05.2015.) 
TIME_FROM (example: 13:00) 

DATE_TO (example: 02.05.2015.) 
TIME_TO (example: 10:00) 

我需要計算這些日期對之間經過了多少天和幾小時。在這個例子中,它不到24小時...所以結果應該是:

0 days 21 hours 

如何實現這一目標?

+3

我不知道FastReports是否會完成這筆交易,但您可能會考慮在您的數據集組件中使用計算字段並在此處進行總和計算。你使用的是什麼類型的日期和時間字段? –

+0

你說得對。同時,我在數據集sql CAST(DATE_FROM as datetime)+ CAST(TIME_FROM as time)中進行了強制轉換AS DATE_TIME_FROM 我可以計算這些生成的字段在SQL中的差異嗎?例如: DATE_TIME_TO - DATE_TIME_FROM? – Volkan

+0

在Sql中有兩次強制轉換我得到了以下結果: 2016-01-13 09:15:00.000 \t 2016-01-13 14:30:00.000 – Volkan

回答

-1

我會安裝TurboPower Orpheus。在您的使用聲明中包含OvcDate單元。這個例子是由柏林10.1建築師製作的,並且是相當向下兼容的。 Orpheus有許多版本。

procedure TForm2.SpeedButton1Click(Sender: TObject); 
var 
    date1 : TDateTime; 
    date2 : TDateTime; 
    rdt1 : TStDateTimeRec; 
    rdt2 : TStDateTimeRec; 
    days : Integer; 
    seconds : Integer; 
    hrs : Integer; 
    min : Integer; 
    sec : Integer; 
begin 
    date1 := StrToDateTime('01/05/2015 13:00'); 
    date2 := StrToDateTime('02/05/2015 10:00'); 
    rdt1.D := DateTimeToStDate(date1); 
    rdt2.D := DateTimeToStDate(date2); 
    rdt1.T := DateTimeToStTime(date1); 
    rdt2.T := DateTimeToStTime(date2); 
    DateTimeDiff(rdt1, rdt2, days, seconds); 
    hrs := seconds div SecondsInHour; 
    min := ((seconds - (hrs * SecondsInHour)) div SecondsInMinute); 
    sec := (seconds - (hrs * SecondsInHour) + (min * SecondsInMinute)); 
    sec := sec; 
    // days = 30 
    // seconds = 75600 
    // hrs = 21 
    // min = 0 
    // sec = 0 
end; 

上面的例子確立了概念驗證並顯示了計算如何工作。您輸入的日期分別爲1.5.2015和2.5.2015,這就是我使用的日期。

我會設置適當的計算字段並將此公式放在OnCalc事件中。一定要建立一個機制來設置開始和停止日期時間字段。讓DBMS完成剩下的工作。我恰好是最受歡迎的Delphi作者之一。 http://cc.embarcadero.com/PopularAuthors.aspx

+0

您不需要安裝奧菲斯在德爾福進行日期計算。它帶有DateUtils單元,它具有用於處理Delphi TDateTime值的許多功能,其中包括DaySpan,HourSpan,DaysBetween和HoursBetween已有十年或更長時間。那麼你最受歡迎的Delphi作者在這裏有什麼東西需要處理?它與所問的問題或你的答案無關。這只是自我強化,在這裏不合適。當您不知道執行任務的內置函數時,它也不會令人印象深刻。 –