插入年,月,日的天数

时间:2010-05-26 22:38:40

标签: delphi

如何在数据库中插入一年中的天数,同时在同一记录中插入月份,月份和星期几? 这是我的表:

tabela / coluna.Dias_ano(注册1 ... 365)

Year:=StrToInt(ano.Text);
diasano.Text:= IntToStr( DaysInAYear(Year) );
diasAno| Mes |diames |dia semana |
1 | janeiro | 1 |Segunda |
2 | janeiro | 2 | Terça |
...
365 | Dezembro | 31 | Segunda 

2 个答案:

答案 0 :(得分:2)

可能我错过了这个问题但是如果我不是,你可以在“DateUtils.pas”找到你需要的东西。它具有“DayOfTheYear”,“MonthOfTheYear”,“DayOfTheMonth”,“DayOfTheWeek”等功能。我想你会将它们存放在不同的领域,但你可能根本不需要存储它们;您正在使用的数据库可能提供类似的功能,在这种情况下,您可以构建查询以提供所需的过滤/排序。

编辑以下第3条评论的代码;

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;

答案 1 :(得分:1)

您可以简单地计算具有1/1 /&lt; year&gt;的值,而不是检查&lt; year&gt;是否跳跃然后使用简单的for循环计算每天的TDateTime值(只需将日期数添加到1月1日值),使用DateUtils函数提取所需的信息并将其写入每天的记录。 但我会再次建议你这样的解决方案。这些都是已编码为日期时间值的信息。我只想存储每个项目的日期,整个日历可以在需要时轻松构建客户端(并且只需要部分),而不必将其完全存储在数据库中。