2009-05-07 6 views
0

ich brauche, um herauszufinden, wie man die Zeit zwischen 2 Mal zu bekommen, aber nur, wenn es innerhalb der Arbeitszeit (in einer Datenbank gespeichert) istberechnet Zeit zwischen zwei TDateTime, mit einem Twist

Das ist, was ich habe für jetzt, aber es ist völlig falsch. die Summe wird nicht korrekt sein.

int __fastcall Organisasjon::CalculateResponsetimeInOpeninghours(std::auto_ptr<DBCommand> cmd, long orgid, TDateTime starttimeIn, TDateTime endtimeIn) 
{ 
int totalTimeInQueue = 0; 
String sIsWorkDay = ""; 

String s = "SELECT o.isworkday, o.workdate, o.workstarttime, o.workendtime " \ 
       "FROM orgwdexcep o " \ 
       "WHERE o.workdate = :date " \ 
       "AND o.orgid = :orgid "; 
String s2 = "SELECT o.isworkday, o.workdate, o.workstarttime, o.workendtime " \ 
       "FROM globalwodexcep o " \ 
       "WHERE o.workdate = :date "; 
String s3 = "SELECT o.workstarttime, o.workendtime " \ 
       "FROM organizationworkday o " \ 
       "WHERE o.weekdayindex = :weekdayindex " \ 
       "AND o.orgid = :orgid "; 
double MailThisDayStart = starttimeIn; 
double MailThisDayEnd = endtimeIn; 

while ((int)MailThisDayStart <= (int)endtimeIn) 
{//for each day i period. 
    if((int)MailThisDayStart != (int)endtimeIn) 
    { 
     MailThisDayEnd = (double)((long)MailThisDayEnd) + 1; 
} 
    cmd->setCommandText(s); 
    cmd->Param("date").setAsDateTime() = DBDatabase::ConvertToSADateTime(MailThisDayStart); 
    cmd->Param("orgid").setAsLong() = orgid; 
    cmd->Execute(); 
    if (!(cmd->isResultSet() && cmd->FetchNext())) 
    { 
     cmd->setCommandText(s2); 
     cmd->Param("date").setAsDateTime() = DBDatabase::ConvertToSADateTime(MailThisDayStart); 
     cmd->Execute(); 
    } 
    if(cmd->isResultSet() && cmd->FetchNext()) 
    { 
     sIsWorkDay = String(cmd->Field("isworkday").asString()); 
    } 
    else 
    { 
     int dayOfTheWeek = DayOfTheWeek(MailThisDayStart); 
     cmd->setCommandText(s3); 
     cmd->Param("weekdayindex").setAsLong() = dayOfTheWeek; 
     cmd->Param("orgid").setAsLong() = orgid; 
     cmd->Execute(); 
     if(cmd->isResultSet() && cmd->FetchNext()) 
     { 
      sIsWorkDay = "T"; 
    } 
    } 
    if(sIsWorkDay == "T") 
    { 
     TDateTime tmpOpeningStart = TDateTime(cmd->Field("workstarttime").asDateTime()); 
     TDateTime tmpOpeningEnd = TDateTime(cmd->Field("workendtime").asDateTime()); 
     double dtmpOpeningStart = tmpOpeningStart- (int)tmpOpeningStart; 
     double dtmpOpeningEnd = tmpOpeningEnd- (int)tmpOpeningEnd; 

     totalTimeInQueue += Organisasjon::CountHours(MailThisDayStart, MailThisDayEnd, dtmpOpeningStart, dtmpOpeningEnd,(int)MailThisDayStart); 
    } 
    MailThisDayStart++;//increase date by one 
    MailThisDayStart = (double)((long)MailThisDayStart); 
} 
return totalTimeInQueue; 
} 

int __fastcall Organisasjon::CountHours(double MailTimeStart, double MailTimeEnd, double openingTimeStart, double openingTimeEnd, int DayToCompute) 
{ 
    if(MailTimeEnd<openingTimeStart) 
    { 
     return 0; 
     } 
    if(MailTimeStart<(DayToCompute+openingTimeStart)) 
    { 
     MailTimeStart=openingTimeStart; 
    } 
    else 
    { 
     MailTimeStart=MailTimeStart-(int)MailTimeStart; 
    } 
    if(MailTimeEnd>(DayToCompute+openingTimeEnd)) 
    { 
    MailTimeEnd=openingTimeEnd; 
    } 
    else 
    { 
    MailTimeEnd=MailTimeEnd-(int)MailTimeEnd; 
    } 
    TDateTime dt = TDateTime((MailTimeEnd - MailTimeStart)); 
    unsigned short milli; 
    unsigned short sec; 
    unsigned short min; 
    unsigned short hour; 
    dt.DecodeTime(&hour,&min,&sec,&milli); 
    int total = hour*3600; 
    total += min*60; 
    total += sec; 
    return total; 
} 
+0

Werden in den Feldern workstarttime und workendtime die Arbeitsstunden oder die Dauer der E-Mail gespeichert? – stukelly

+0

workstarttime und workendtime speichern die Öffnungszeiten der Organisation zum angegebenen Datum, der organisatorische Arbeitstag sieht wie folgt aus: id, orgId, weekDay, workStartTime, workEndTime. Parameter für die Methode TDateTime starttimeIn, TDateTime endtimeIn ist die Zeit für den Zeitpunkt, zu dem die E-Mail zuerst im System registriert wurde, und die Endzeit, wenn jemand sie beantwortet hat. – Qwark

Antwort

1

Was möchten Sie in total sehen?

Versuchen Sie dieses Beispiel:

TDateTime MailTimeEnd = TDateTime::CurrentTime();; 
MailTimeEnd += 1.0/24; 
TDateTime MailTimeStart = TDateTime::CurrentTime(); 
TDateTime dt = TDateTime((MailTimeEnd - MailTimeStart)); 
unsigned short milli; 
unsigned short sec; 
unsigned short min; 
unsigned short hour; 
dt.DecodeTime(&hour,&min,&sec,&milli); 
int total = hour*3600; 
total += min*60; 
total += sec; 

total == 3600. Es ist richtig.

+0

Die Summe sollte die Gesamtzahl der Sekunden sein, die die E-Mail in einer Warteschlange gewartet hat, aber nur Sekunden innerhalb der Arbeitsstunden sollten enthalten sein. Eine E-Mail könnte tagelang in einer Warteschlange warten, so dass der Algorithmus jeden Tag nach den Öffnungszeiten suchen muss. – Qwark

Verwandte Themen