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;
}
Werden in den Feldern workstarttime und workendtime die Arbeitsstunden oder die Dauer der E-Mail gespeichert? – stukelly
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