2012-05-02 322 views
2

如何比较最新的部分在Informix的数据库管理系统:如何与另一日期(月/年)比较日期(月/年)

我写了下面的查询,但我得到一个语法错误:

select id,name from h_history 
where (h_date::DATETIME YEAR TO MONTH >= 2/2012) 
    and (h_date::DATETIME YEAR TO MONTH <= 1/2013) 

我想与年和月比较

如何做到这一点?

+1

您可能会过度谴责这一点。 h_date是日期时间字段吗? – swasheck

+0

它的日期字段 –

回答

7

如果你要使用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,而且也从整数datetime或反之亦然没有隐式转换。

你可以写:

-- 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是一个日期,而不是DATETIME X到Y型,还有其他的选择。年,月,日的功能从DATE提取明显的部位(和,如果传递一个DATETIME的功能,那么DATETIME将被强制转换为日期,然后处理过的)。唯一完全与区域无关的DATE构造函数是带有3个参数(月,日和年)的MDY函数。所有的字符串表示都受到语言环境的解释,因此无法在任何地方一直工作。

你也可以这样做:

-- 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函数。这往往是冗长的。

+0

真的非常感谢。 –

+0

我希望这个语法适用于'informix' –

+2

噢,如果是另一个DBMS,我会担心,但我对Informix充满信心(除非我犯了错字)。 –

2

请尝试以下

SELECT 
    id,name 
FROM h_history 
WHERE 
    h_date >= MDY(2, 1, 2012) 
    AND h_date < MDY(2, 1, 2013) 
+0

如何月份> 2且<1 !! 它给了我假所有的时间 –

+0

这将会是' swasheck

+0

@just_name对不起,心中毛刺 – erikxiv

2

假设h_date是一个适当的日期字段,为什么不

SELECT 
     id 
    , name 
FROM h_history 
WHERE h_date >= '02/01/2012' and h_date <= '01/31/2013' 

为你工作?

0
select * from table t where MONTH(t.date) = 12 
+0

请添加一些信息到你的代码 – manniL

+0

例如列的日期是在我的表“用户”提供这样的办法只能月份比较该日期列 –