Как сравнить Firebird TimeStamp и Delphi DateTime? - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть следующий скрипт, который никогда не получает никаких данных, так как тип данных TimeStamp в Firebird / Interbase не DateTime (*)

Как мне это исправить ??TX.

 with DMApp.qryValidPeriod_ do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select P.* from PERIOD P, FISCAL_YR F');    
    SQL.Add('where');
    SQL.Add('P.FISCAL_YR_ID = F.FISCAL_YR_ID and');     
    SQL.Add('F.ENTITY_DB_ID = :PRIMARY_DB_ID and');     
    SQL.Add('F.FISCAL_YR_ID = :CURR_FY_ID and');        
    SQL.Add(':pTranDate BETWEEN P.BEG_PERIOD and P.END_PERIOD');

    ParamByName('pTranDate').AsDateTime :=  sBATCH_DATE; 

// BEG_PERIOD и END_PERIOD - это тип данных TimeStamp, например «2010-11-09 12:00» // параметр, возвращающий тип данных, например «2010-11-09»


(*) Временная метка - это тип данных столбца, доступный в Firebird / Interbase / SQL Server ..., который помогает обеспечить целостность данных.Отметки времени автоматически обновляются каждый раз, когда строка, содержащая столбец отметки времени, вставляется или обновляется.Значения в столбцах меток времени - это не данные даты и времени, а двоичные (8) данные varbinary (8).Тип данных timestamp не имеет отношения к системному времени, это просто монотонно увеличивающийся счетчик, значения которого всегда будут уникальными в базе данных (что делает его в основном уникальным случайным числом).

Ответы [ 3 ]

5 голосов
/ 11 ноября 2010

Разве вы не неправильно поняли типы данных TIMESTAMP в Firebird? В SQL92 TIMESTAMP является стандартным типом данных для хранения значений даты и времени. Он не обновляется автоматически, и функции, возвращающие значения TIMESTAMP, связаны со временем базы данных.

AFAIK, реализация Firebird TIMESTAMP следует правилам SQL 92 (http://www.firebirdsql.org/index.php?op=guide&id=ib6_newfeatures#datetime), и должна отлично работать с параметром Delphi .AsDateTime.

Это параметры SQLEST TIMESTAMP, которые вы описали - и их никогда нельзя использовать по сравнению с датой и временем: «Тип данных отметки времени SQL Server не имеет ничего общего с временем или датами» http://msdn.microsoft.com/en-us/library/ms191240(SQL.90).aspx

1 голос
/ 11 ноября 2010

Обычно я использую его как строковый параметр из-за временной части. Идея состоит в том, чтобы иметь независимый от настроек формат, например, '11 -NOV-2010 12: 32: 25 '

Например, вы можете попробовать

ParamByName('pTranDate').AsString :=  FormatSQLDateTime(sBATCH_DATE);

Где вы должны иметь функции, подобные этим

function FormatSQLDate(date: TDate) : string;
const months : array[1..12] of string[3] =
('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC');
 var d, y : integer;
     m : string[3];
begin
   d := DayOf(date);
   y := YearOf(date);
   m := months[MonthOf(date)];
   Result := Format('%d-%s-%d', [d, m, y]);
end;


function FormatSQLDateTime(date : TDateTime) : String;
var
  d : String;
  h, m, s : Integer;
begin
  d := SQLDate(date);
  h := HourOf(date);
  m := MinuteOf(date);
  s := SecondOf(date);
  Result := d + Format(' %d:%d:%d', [h, m, s]);
end;

Обратите внимание, что вы также можете что-то отработать на стороне сервера с использованием sql extract

extract(day from timestamp_field)

http://www.firebirdsql.org/refdocs/langrefupd20-extract.html

0 голосов
/ 11 ноября 2010

UDF ниже написано в Delphi.Он получает три части даты и возвращает значение даты в формате Firebird.Возможно, это поможет вам понять, как конвертировать даты между Delphi и FB.

type
  PIBDateTime = ^TIBDateTime;
  TIBDateTime = record
    Days,                           // Date: Days since 17 November 1858
    MSec10 : Integer;               // Time: Millisecond * 10 since midnigth
  end;

const                               // Date translation constants
  MSecsPerDay10 = MSecsPerDay * 10; // Milliseconds per day * 10
  IBDateDelta = 15018;              // Days between Delphi and InterBase dates

// ==============================================
//  declare external function ...
//    smallint, smallint, smallint, date
//  returns
//    date
//  ...
// ==============================================

function g_d_encodedate(var Year, Month, Day: SmallInt;
  var IBDateTime: TIBDateTime): PIBDateTime; cdecl; export;
var
  DateTime: TDateTime;
  DelphiDays : Integer;
begin
  DateTime := EncodeDate(Year, Month, Day);
  DelphiDays := Trunc(DateTime);
  with IBDateTime do begin
    Days := DelphiDays + IBDateDelta;
    MSec10 := Trunc((DateTime - DelphiDays) * MSecsPerDay10);
  end;
  Result := @IBDateTime;
end;
...