2010-05-26 141 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函數提取所需的信息並將它們寫入每天的記錄。 但我會再次建議你這樣的解決方案。這些都是已經編碼成日期時間值的信息。我只需將每個項目的日期存儲起來,整個日曆可以在需要時輕鬆構建客戶端(並且只需要所需的部分),而無需將其全部存儲在數據庫中。