1

現在、SQL 接続が統合された Delphi アプリケーションを作成しています。
SQL は日付値を YYYY-MM-DD の形式で保存しますが、Delphi アプリケーション内でこれらの値を読み取ると、MM-DD-YYYY の形式で読み取られます。

現在、データベースから日付の値を読み取るコードを作成しましたが、2 か月の整数または 2 日の整数を持たない値の処理に問題があります。たとえば、2013 年 2 月 17 日の日付は「2/17/2013」と読み取られます。

私の現在のコードは、日付を日、月、年に分けています。Delphi 内の「コピー」コマンドを使用して、テキスト内の対応する値を読み取るため、完全な日付 (MM/DD/YYYY) に適しています。M/D/YYYY 形式の日付を読み取ると、文字列から正しい値がコピーされません。

分離コードを実行する前に文字列を編集して、文字列を強制的に MM/DD/YYYY の形式にする方法はありますか? 私の考えは、文字列の形式をチェックするコードを書き、不足しているゼロを追加することです。つまり、2/17/2013 を 02/17/2013 に変更します。

おそらく自分自身で物事を難しくするために何かをしていることはわかっていますが、これは現時点での私のコードであるため、現在のコードに追加して問題を解決するための助けをいただければ幸いです。

ありがとう、A.

4

2 に答える 2

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();

私が知っている利用可能なすべてのデータベース アクセス レイヤーで動作します。

于 2013-02-17T17:20:17.257 に答える
1

私は Delphi には詳しくありませんが、それが .net、ColdFusion、php、またはその他のアプリケーション テクノロジのようなものであれば、原則は同じです。

まず、データベースに日時データ型があるため、重要な時間形式はいつ表示するかだけです。日付は文字列ではなく数値です。

次に、さまざまな理由から、クエリ パラメーターはあなたの味方です。Delphi で datetime 変数を作成し、それをパラメータとして MySql に送信できれば、非常に便利です。

于 2013-02-17T15:02:06.713 に答える