如何比较日期(月/年)与另一个日期(月/年)

时间:2012-05-02 14:53:45

标签: sql datetime informix

如何比较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 )

我想与年月比较

怎么做?

4 个答案:

答案 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的整数除法,并且没有从整数到日期时间的隐式转换,反之亦然。

你可以写:

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

答案 1 :(得分:2)

尝试以下

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

答案 2 :(得分:2)

假设h_date是正确的日期字段,为什么不

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

为你工作?

答案 3 :(得分:0)

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