无法根据 Informix 中的日期过滤器过滤记录
Posted
技术标签:
【中文标题】无法根据 Informix 中的日期过滤器过滤记录【英文标题】:Not able to filter records based on date filter in Informix 【发布时间】:2016-09-22 10:12:41 【问题描述】:我想对 Informix 查询添加过滤器:
WHERE agentstatedetail.eventdatetime < '1753-01-01 00:00:00' - INTERVAL(3) DAY TO DAY
但它失败了...... 请说出哪里出错了。
【问题讨论】:
稍后我会试验一下您使用的符号有何变化,但使用DATETIME(1753-01-01 00:00:00) YEAR TO SECOND
应该会让您的节目重新上路。
【参考方案1】:
如评论中所述,解决方案是确保将字符串解释为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;
这是嵌入到最小 SELECT 语句中的原始 WHERE 子句。它产生错误:
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
【讨论】:
以上是关于无法根据 Informix 中的日期过滤器过滤记录的主要内容,如果未能解决你的问题,请参考以下文章