也許我錯過了問題,但如果我不是,你可以在「DateUtils.pas」中找到你需要的。它具有「DayOfTheYear」,「MonthOfTheYear」,「DayOfTheMonth」,「DayOfTheWeek」等功能。我想你會把它們存儲在不同的領域,但可能有一點可能是你根本不需要存儲它們;您使用的數據庫可能會提供類似的功能,在這種情況下,您可以構建查詢以提供所需的過濾/排序。
編輯:代碼爲下面的第三條評論;
procedure TForm1.Button1Click(Sender: TObject);
var
Year, DaysInYear: Word;
FirstDay, i: Integer;
begin
Year := StrToInt(ano.Text);
DaysInYear := DaysInAYear(Year);
diasano.Text := IntToStr(DaysInYear);
FirstDay := Trunc(EncodeDate(Year, 1, 1));
for i := FirstDay to FirstDay + DaysInYear - 1 do begin
Planeamento.Append;
Planeamento.FieldByName('diasAno').Value := DayOfTheYear(i);
Planeamento.FieldByName('Month').Value := LongMonthNames[MonthOfTheYear(i)];
Planeamento.FieldByName('DayOfMonth').Value := DayOfTheMonth(i);
Planeamento.FieldByName('DayOfWeek').Value := LongDayNames[DayOfTheWeek(i)];
Planeamento.Post;
end;
end;
編輯:隨着計算字段;
對於下面的例子,表格有五列而不是四列。我們來命名第一列'日期'。此列是唯一存儲數據的列,並且將保存日期(根據ldsandon的answer,因爲通過存儲日期而不是日期編號,您將不必跟蹤哪個表代表哪一年,並且計算將是簡單)。 其他四列與問題中的完全相同,只是它們都是「計算字段」。
procedure TForm1.Button1Click(Sender: TObject);
var
Year, DaysInYear: Word;
FirstDay, i: Integer;
begin
Year := StrToInt(ano.Text);
DaysInYear := DaysInAYear(Year);
diasano.Text := IntToStr(DaysInYear);
FirstDay := Trunc(EncodeDate(Year, 1, 1));
for i := FirstDay to FirstDay + DaysInYear - 1 do begin
Planeamento.Append;
Planeamento.FieldByName('Date').Value := i;
Planeamento.Post;
end;
end;
procedure TForm1.PlaneamentoCalcFields(DataSet: TDataSet);
var
Date: TDateTime;
begin
Date := DataSet.FieldByName('Date').AsDateTime;
DataSet.FieldByName('diasAno').AsInteger := DayOfTheYear(Date);
DataSet.FieldByName('Month').AsString := LongMonthNames[MonthOfTheYear(Date)];
DataSet.FieldByName('DayOfMonth').AsInteger := DayOfTheMonth(Date);
DataSet.FieldByName('DayOfWeek').AsString := LongDayNames[DayOfTheWeek(Date)];
end;
你確定這是個好主意嗎?當然,使用日曆代碼來計算日期的日期編號或日期名稱會更好,而不是(有效)將其硬編碼到數據庫中。它每年都會改變。 – 2010-05-27 02:05:57
我建議你也用英文發佈例子。這會讓你更容易理解你想要獲得的東西。 – 2010-05-27 13:12:26