【问题标题】:Delphi SQL Date reading issueDelphi SQL 日期读取问题
【发布时间】:2013-02-02 01:25:37
【问题描述】:

我目前正在创建一个集成了 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

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

谢谢,A。

【问题讨论】:

  • 数据库中字段的数据类型是什么?
  • 想向我们展示您读取数据库字段值的位置吗?它可以提供很大帮助,但作为一个想法,您可以执行 Query.FieldMyDateTimeField.AsDateTime => TDateTime 值,然后您可以随意格式化,即 DateToStr(MyDateTimeValue, MyTFormatSettings);
  • 它们是 mysql 中的日期时间值和我的 dlephi 应用程序中的字符串值 - 使用 Fields[i].AsString 从 DBGrid 读取值
  • 我已更改代码以将值读取为 TDateTime 值,但是它们的格式与 MM/D/YYYY 相同。我将如何使用 TFormatSettings 来配置这些值的布局?谢谢,A
  • @user2057482 将变量声明为 TFormatSettings 并根据需要设置日期和/或时间格式,即 MyFormatSettings.Short|LongDateFormat、MyFormatSettings.Shot|LongTimeFormat 等。不要忘记 MyFormatSettings .Date|TimeSeparator 字符

标签: mysql sql database delphi date


【解决方案1】:

作为一般规则,不要将 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();

它适用于我所知道的所有可用的数据库访问层。

【讨论】:

  • 非常感谢@jachguate - 我会考虑在将值存储到我的数据库时使用参数,并尝试使用我的代码。
【解决方案2】:

我不熟悉Delphi,但如果是.net、ColdFusion、php或任何其他应用技术,原理都是一样的。

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

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

【讨论】:

  • 目前,我需要使用这些值来链接我的应用程序中的日期。因此,当用户从日历中选择日期“17/02/2013”​​时,会选择我的 dbBgrid 中日期为“02/17/2013”​​的相应项目。因此,我处理这些值的问题。如果我无法理解您的评论,我们深表歉意。
  • 使用我提到的其他技术,如果用户选择 '17/02/2013',应用程序代码会将该字符串转换为 Date 或 DateTime 对象。我不使用 Delphi,但谷歌将我带到了一个名为 StrToDateTime 的函数的页面。此外,此页面delphi.about.com/od/database/l/aa050101a.htm 向您展示了如何使用查询参数。
  • 感谢@Dan Bracuk - 我设法使用了 StrToDate 函数并使用 "ShortDateFormat := 'dd/mm/yyyy';" 设置了我自己的格式- 这让我可以根据需要处理格式。我会阅读你发给我的链接。谢谢您的帮助。 A.
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2010-12-05
  • 2016-03-24
  • 2011-11-21
相关资源
最近更新 更多