2010-11-11 107 views
0

我有以下脚本,从来没有检索火鸟/ Interbase的,因为时间戳数据类型的任何数据不DATETIME(*)如何比较Firebird TimeStamp和Delphi 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是时间戳数据类型,诸如,如 '2010-11-09'


'2010-11-09 12:00' //参数返回的数据类型

(*)时间戳是Firebird/Interbase/SQL Server中可用的列数据类型...有助于确保数据完整性。每次插入或更新包含时间戳列的行时,时间戳都会自动更新。时间戳列中的值不是日期时间数据,而是二进制(8)varbinary(8)数据。 timestamp数据类型与系统时间无关,它只是一个单调递增的计数器,它的值在数据库中始终是唯一的(使其基本上是一个唯一的随机数。)

+1

TimeStamp在这个例子中是你自己的自定义数据类型吗?因为我们使用非常规的TIMESTAMP数据类型进行了大量工作,与查询参数相比,它工作得很好。 – 2010-11-11 06:44:19

+0

不,不是。它是火鸟2.5。如上所示,脚本从不返回任何数据 - (因为参数pTranDate的值仅在调试器中看到日期格式) – volvox 2010-11-11 13:10:28

+1

该代码应正常工作。查询返回没有结果的原因可能会有所不同。检查你的其他参数。 – 2010-11-11 13:12:57

回答

5

是不是你误解了Firebird中的TIMESTAMP数据类型?在SQL92中,TIMESTAMP是一个标准数据类型,用于保存日期和时间值。它不会自动更新,并且返回TIMESTAMP值的函数与数据库时间有关。 AFAIK,Firebird TIMESTAMP实现遵循SQL 92规则(http://www.firebirdsql.org/index.php?op=guide&id=ib6_newfeatures#datetime),它应该与Delphi .AsDateTime参数一起工作。

这是SQL服务器的TIMESTAMP像你描述的是 - 应该老死不相日期和时间比较中使用的“SQL Server时间戳数据类型无关,与时间或日期” http://msdn.microsoft.com/en-us/library/ms191240(SQL.90).aspx

+0

对不起 - 是的,我在描述SQL Server TIMESTAMP。我的上面的脚本只在param pTranDate是'Date''Time'格式(即2010-11-09 00:00)时才返回数据。因为它是我只得到日期(2010-11-09) – volvox 2010-11-11 13:07:26

+0

SORRY家伙 - 我混淆了Firebird和SQL Server之间的事情(因为我的应用程序是多服务器)。现在在你的帮助下,我得到了正确的东西,Delphi DateTime与Firebird TimeStamp数据类型一起工作正常。 – volvox 2010-11-11 14:23:11

0

以下用UDF编写的UDF。它以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; 
1

通常情况下,我使用它作为字符串参数,因为时间部分。 想法是有设置独立的格式,例如'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(day from timestamp_field) 

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

+1

通常最好用数字格式保存日期,并让驱动程序/客户端/数据库负责其余部分。它也稍快,因为引擎不需要解析和转换字符串。 Firebird的问题较少,因为它理解一组固定的字符串文字,但在其他数据库中,“标准”日期文字格式可以根据操作系统区域设置,数据库设置以及客户端区域设置和设置进行更改。恕我直言,这是一个很好的避免字符串的行为。 – 2010-11-11 11:55:56

+0

感谢这个功能和参考Sofija - 它会在我的应用程序的某些其他部分有用。现在我正确地使用Firebird TimeStamp和Delphi DateTime。 – volvox 2010-11-11 14:25:45