如何在 Informix DBMS 中比较部分日期:
我编写了以下查询,但出现语法错误:
select id,name from h_history
where ( h_date::DATETIME YEAR TO MONTH >= 2/2012 )
and ( h_date::DATETIME YEAR TO MONTH <= 1/2013 )
我想与年份和月份进行比较
这该怎么做?
如果要使用 DATETIME 路由,则需要正确格式化值。事实上,你已经写了:
select id,name from h_history
where ( h_date::DATETIME YEAR TO MONTH >= 2/2012 )
and ( h_date::DATETIME YEAR TO MONTH <= 1/2013 )
这2/2012
是一个等于 0 的整数除法,并且没有从整数到日期时间的隐式转换,反之亦然。
你可以写:
-- Query 1
SELECT id, name
FROM h_history
WHERE (h_date::DATETIME YEAR TO MONTH >= DATETIME(2012-02) YEAR TO MONTH)
AND (h_date::DATETIME YEAR TO MONTH <= DATETIME(2013-01) YEAR TO MONTH)
这是冗长但准确的。您可以使用捷径:
-- Query 2
SELECT id, name
FROM h_history
WHERE (h_date::DATETIME YEAR TO MONTH >= '2012-02')
AND (h_date::DATETIME YEAR TO MONTH <= '2013-01')
但是,由于h_date
是 DATE 而不是 DATETIME X TO Y 类型,因此还有其他可用选项。YEAR、MONTH、DAY 函数从 DATE 中提取明显的部分(并且,如果将 DATETIME 传递给函数,则 DATETIME 将被强制转换为 DATE,然后进行处理)。唯一完全独立于语言环境的 DATE 构造函数是 MDY 函数,它接受 3 个参数,即月、日和年。所有字符串表示都受语言环境的解释,因此不会一直在任何地方工作。
你也可以这样做:
-- Query 3
SELECT id, name
FROM h_history
WHERE (h_date >= MDY(2, 1, 2012))
AND (h_date <= MDY(1, 31, 2013))
或者:
-- Query 4
SELECT id, name
FROM h_history
WHERE ((YEAR(h_date) = 2012 AND MONTH(h_date) >= 2) OR YEAR(h_date) >= 2013)
AND ((YEAR(h_date) = 2013 AND MONTH(h_date) <= 1) OR YEAR(h_date) < 2013)
或者:
-- Query 5
SELECT id, name
FROM h_history
WHERE (YEAR(h_date) * 100 + MONTH(h_date)) >= 201202
AND (YEAR(h_date) * 100 + MONTH(h_date)) <= 201301
如果可以选择,我可能会使用查询 2 简洁但准确,或者可能使用查询 5,但所有查询 1-5 都是可用的。
如果h_date
是某个 DATETIME 类型的列,并且您需要比较 DATETIME 的各个部分,则可以使用强制转换(如查询 1 中所示)或 EXTEND 函数。这往往是冗长的。
尝试以下
SELECT
id,name
FROM h_history
WHERE
h_date >= MDY(2, 1, 2012)
AND h_date < MDY(2, 1, 2013)
假设这h_date
是一个正确的日期字段,为什么不
SELECT
id
, name
FROM h_history
WHERE h_date >= '02/01/2012' and h_date <= '01/31/2013'
为你工作?
select * from table t where MONTH(t.date) = 12