1

我目前正在创建一个集成了 SQL 连接的 Delphi 应用程序。
SQL 以 YYYY-MM-DD 格式存储其日期值,但是,当我在 Delphi 应用程序中读取这些值时,它们以 MM-DD-YYYY 格式读取。

我目前已经编写了代码来从我的数据库中读取日期的值,但是我在处理没有 2 个月整数或 2 天整数的值时遇到了问题。例如,日期 2013 年 2 月 17 日将读作“2/17/2013”

我当前的代码将日期分为日、月和年。它适用于完整日期(MM/DD/YYYY),因为它使用 Delphi 中的“复制”命令读取文本中的相应值。当它读取格式为 M/D/YYYY 的日期时,它不会从字符串中复制正确的值。

在我运行我的分离代码之前有什么方法可以编辑字符串,以便它强制字符串转换为 MM/DD/YYYY 的格式。我的想法是编写代码来检查字符串的格式,然后添加任何缺少的零:即将 2/17/2013 更改为 02/17/2013

我知道我可能正在做一些事情让自己变得更难,但这是我目前的代码,所以任何通过添加到我当前的代码来解决我的问题的帮助将不胜感激。

谢谢。

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 或任何其他应用程序技术,原理都是一样的。

首先,由于您的数据库中有一个 datetime 数据类型,唯一重要的时间格式是您显示它的时间。日期是数字,而不是字符串。

接下来,出于各种原因,查询参数是您的朋友。如果能在Delphi中创建一个datetime变量,作为参数传给MySql,生活会很美好。

于 2013-02-17T15:02:06.713 回答