2010-05-26 100 views
0

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

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

你确定这是个好主意吗?当然,使用日历代码来计算日期的日期编号或日期名称会更好,而不是(有效)将其硬编码到数据库中。它每年都会改变。 – 2010-05-27 02:05:57

+0

我建议你也用英文发布例子。这会让你更容易理解你想要获得的东西。 – 2010-05-27 13:12:26

回答

2

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

我必须使用类似于我所说的代码,因为它将像全年工作日的工作日历一样。所以我会给国际年,我必须在今年(2010 = 365天)插入日期,第一天将是1月,1日,星期二等。每个记录(365条记录)然后我(DaysInAYear(Year)),但我怎样才能一次插入墙壁! 谢谢你的 – 2010-05-27 07:01:48

+1

你可以在计算“day of”值时插入“day no”并插入他们到每个迭代的表格,但我想这不会插入“一次全部”....但是,如果你需要的信息是在客户端,你不需要存储它们。可以通过计算字段来呈现它们,只需要一个从“day-no”表到“tasks”表的一对多关系。 – 2010-05-27 10:49:29

+0

我在这一年做了一次什么,如下所示: procedure TPlaneamento.Button1Click(Sender:TObject); Var i j k m begin inherited; 年份:= StrToInt(ano.Text);diasano.Text:= IntToStr(DaysInAYear(Year)); 米:=(的FormatDateTime( 'DDDD',现在)) 为I:= 1到StrToInt(diasano.Text)做 开始 frmDados.Planeamento.Append; frmDados.Planeamento.FieldByName('month')。value:= I; frmDados.Planeamento.FieldByName('dayofmonth')。value:= I; frmDados.Planeamento.FieldByName('dayofmonth')。value:= I; frmDados.Planeamento.FieldByName('dayofweek')。value:= j; Thank's – 2010-05-27 14:33:10

1

你可以简单地计算出什么样的价值为1/1 /<年>,比检查<年>是飞跃与否,然后用一个简单的for循环计算TDateTime类型值每天(只是添加天数到1月1日的值),使用DateUtils函数提取所需的信息并将它们写入每天的记录。 但我会再次建议你这样的解决方案。这些都是已经编码成日期时间值的信息。我只需将每个项目的日期存储起来,整个日历可以在需要时轻松构建客户端(并且只需要所需的部分),而无需将其全部存储在数据库中。