2010-11-11 70 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