sql >> Databasteknik >  >> RDS >> Mysql

Delphi SQL Datumläsningsproblem

Som en allmän regel, behandla inte TDateTime-värden som strängar, utan som datum och tider.

Få inte värdet av ett Date/Time-fält med AsString-metoden, använd AsDateTime-metoden och tilldela den till en TDateTime-variabel.

Om du vill veta datumdelarna, använd de medföljande funktionerna för att göra det. Till exempel de som är tillgängliga i DateUtils enhet. SysUtils enheten innehåller även några datum/tid-relaterade funktioner.

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

Detsamma gäller för att lagra värden i databasen, istället för att använda ett fast datumformat, använd parametrar, så här:

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

Det fungerar med alla tillgängliga lager för databasåtkomst som jag känner till.



  1. Vad är andra nivån SQL Injection

  2. Hur tar jag bort från flera tabeller med INNER JOIN i SQL-servern

  3. SQL-serverprestandastatistik för att ligga steget före i spelet

  4. Begränsa SQL-frågeresultat i MySQL