2016-09-22 43 views
0

我希望把過濾器上的Informix查詢記錄:無法篩選基於日期過濾器中的Informix

WHERE agentstatedetail.eventdatetime < '1753-01-01 00:00:00' - INTERVAL(3) DAY TO DAY 

,但它不能... 請先告知哪裏出了問題。

+0

我會用什麼了記號後試驗您正在使用,但使用'DATETIME(1753年1月1日00:00:00)YEAR TO秒'應該得到你的節目回來的路上。 –

回答

2

如所指出的在一個評論,該解決方案是,以確保字符串被解釋爲一個DATETIME值。最簡單的方法做到這一點是使用DATETIME文字符號:

DATETIME(1753-01-01 00:00:00) YEAR TO SECOND 

爲了證明:

CREATE TABLE agentstatedetail 
(
    eventdatetime DATETIME YEAR TO SECOND NOT NULL PRIMARY KEY, 
    eventname VARCHAR(64) NOT NULL 
); 

INSERT INTO agentstatedetail VALUES('1752-12-25 12:00:00', 'Christmas Day, Noon, 1752'); 
INSERT INTO agentstatedetail VALUES('1752-12-31 12:00:00', 'New Year''s Eve, Noon, 1752'); 
INSERT INTO agentstatedetail VALUES('1753-01-01 12:00:00', 'New Year''s Day, Noon, 1753'); 

SELECT * FROM agentstatedetail WHERE agentstatedetail.eventdatetime < '1753-01-01 00:00:00' - INTERVAL(3) DAY TO DAY; 

這是你原來的WHERE子句嵌入到一個最小的SELECT語句。它產生的錯誤:

SQL -1261: Too many digits in the first field of datetime or interval. 

(注:這本來是有幫助的,包括在這個問題的錯誤消息。)

下面是查詢的替代版本,在地方DATETIME文字:

從樣本數據
SELECT * FROM agentstatedetail 
    WHERE agentstatedetail.eventdatetime < DATETIME(1753-01-01 00:00:00) YEAR TO SECOND - 
              INTERVAL(3) DAY TO DAY 
; 

輸出:

1752-12-25 12:00:00|Christmas DAY, Noon, 1752 

我觀察到計算的值是一個常數;你可以重寫代碼爲:

SELECT * FROM agentstatedetail 
    WHERE agentstatedetail.eventdatetime < DATETIME(1752-12-29 00:00:00) YEAR TO SECOND 

我懷疑這個值是作爲參數傳遞的。

或者,你可以投的字符串DATETIME值,你會得到相同的結果:

SELECT * FROM agentstatedetail 
    WHERE agentstatedetail.eventdatetime < CAST('1753-01-01 00:00:00' AS DATETIME YEAR TO SECOND) - 
              INTERVAL(3) DAY TO DAY 
; 

或:

SELECT * FROM agentstatedetail 
    WHERE agentstatedetail.eventdatetime < '1753-01-01 00:00:00'::DATETIME YEAR TO SECOND - 
              INTERVAL(3) DAY TO DAY