2013-02-17 91 views
1

我正在創建一個集成了SQL連接的Delphi應用程序。
SQL以YYYY-MM-DD格式存儲其日期值,但是,當我在Delphi應用程序中讀取這些值時,它們將以MM-DD-YYYY格式讀取。Delphi SQL日期閱讀問題

我目前已經編寫了從我的數據庫中讀取日期值的代碼,但是我無法處理沒有2個月整數或2天整數的值。例如,2013年2月17日的日期將被視爲'2/17/2013'

我的當前代碼將日期分隔爲日,月和年。它適用於完整日期(MM/DD/YYYY),因爲它使用Delphi中的「複製」命令讀取文本中的相應值。當它讀取格式爲M/D/YYYY的日期時,它不會從字符串中複製正確的值。

有沒有什麼辦法在我運行我的分離代碼之前編輯字符串,以便強制字符串變成MM/DD/YYYY的格式。我的想法是編寫代碼來檢查字符串的格式,然後添加丟失的零:即將2013年2月17日更改爲02/17/2013

我知道我可能在做某件事對自己來說更難,但是這是我現在的代碼,所以通過添加我當前的代碼來解決我的問題的任何幫助都將非常感激。

感謝,A

+0

數據庫中字段的數據類型是什麼? – 2013-02-17 14:55:30

+0

想告訴我們你閱讀你的db字段值的地方嗎?它可以幫助很多,但作爲一個想法,你可以做Query.FieldMyDateTimeField.AsDateTime => TDateTime值,然後你可以格式化,即你DateToStr(MyDateTimeValue,MyTFormatSettings); – ComputerSaysNo 2013-02-17 14:57:46

+0

他們是mysql中的日期時間值和我的dlephi應用程序中的字符串值 - 使用Fields [i]。AsString讀取DBGrid中的值 – Babah254 2013-02-17 14:58:05

回答

3

作爲一般規則,不要將TDateTime值視爲字符串,而應視爲日期和時間。

不要使用AsString方法獲取日期/時間字段的值,請使用AsDateTime方法並將其分配給TDateTime變量。

如果你想知道日期部分,使用提供的功能來做到這一點。例如在DateUtils單元中可用的那些。 SysUtils單位還包含一些日期/時間相關的功能。

uses 
    DateUtils, SysUtils; 

var 
    MyDate: TDateTime; 
    MyDay, MyMonth, MyYear: Word; 
begin 
    MyDate := MyQuery.Fields[3].AsDateTime; //not AsString 
    MyDay := DayOf(MyDate); 
    MyMonth := MonthOf(MyDate); 
    MyYear := YearOf(MyDate); 
    ShowMessage(Format('Day: %d, Month: %d, Year: %d', [MyDay, MyMonth, MyYear]); 

    //or also 
    MyDate := EndOfTheMonth(MyDate); 
    DecodeDate(MyDate, MyYear, MyMonth, MyDay); 
    ShowMessage(Format('Day: %d, Month: %d, Year: %d', [MyDay, MyMonth, MyYear]); 

這同樣適用於存儲值的數據庫,而不是使用一個固定的日期格式,使用的參數,如:

uses 
    DateUtils, SysUtils; 

var 
    MyDate: TDateTime; 
    MyDay, MyMonth, MyYear: Word; 
begin 
    MyDate := EncodeDate(2013, 2, 17); 
    MyQuery.SQL.Text := 'insert into myTable (MyDate) values (:MyDate)'; 
    MyQuery.Params.ParamByName('MyDate').AsDateTime := MyDate; 
    MyQuery.ExecSQL(); 

它與我所知道的所有可用的數據庫訪問層的。

+0

非常感謝@jachguate - 在將值存儲到我的數據庫中時,我會研究使用參數,並且可以使用我的代碼。 – Babah254 2013-02-19 16:25:10

+0

@歡迎使用者! – jachguate 2013-02-19 16:55:24

1

我不熟悉德爾福,但如果它像.NET,ColdFusion的,PHP或任何其他應用程序的任何技術,原理是一樣的。

首先,因爲你的數據庫中有一個datetime數據類型,唯一的時間格式很重要,當你顯示它時。日期是數字,而不是字符串。

接下來,由於各種原因,查詢參數是您的朋友。如果您可以在Delphi中創建日期時間變量,並將其作爲參數發送給MySql,則生活將會非常好。

+0

此刻,我需要使用這些值鏈接到我的應用程序中的日期。因此,當用戶從日曆中選擇日期'17/02/2013'時,會從我的dbBgrid中選擇與日期'02/17/2013'相對應的項目。因此我處理價值的問題。 道歉,如果我無法理解您的評論。 – Babah254 2013-02-17 15:07:40

+0

對於我提到的其他技術,如果用戶選擇'17/02/2013',則應用程序代碼會將該字符串轉換爲Date或DateTime對象。我不使用Delphi,但谷歌帶我到一個名爲StrToDateTime的函數頁面。另外,該頁面http://delphi.about.com/od/database/l/aa050101a.htm向您展示瞭如何使用查詢參數。 – 2013-02-17 15:53:09

+0

謝謝@Dan Bracuk - 我設法使用了StrToDate函數,並使用「ShortDateFormat:='dd/mm/yyyy';」 - 這使我可以根據需要調整格式。我將閱讀你發給我的鏈接。謝謝您的幫助。答: – Babah254 2013-02-17 16:04:02