也许我错过了问题,但如果我不是,你可以在“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