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

Posted

技术标签:

【中文标题】如何将日期(月/年)与另一个日期(月/年)进行比较【英文标题】:How to compare date (month/year) with another date (month/year) 【发布时间】:2012-05-02 14:53:45 【问题描述】:

如何在 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 )

我想和年份和月份比较

如何做到这一点?

【问题讨论】:

你可能想多了。 h_date 是日期时间字段吗? 【参考方案1】:

如果您要使用 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 函数。这往往是冗长的。

【讨论】:

哦,是的;如果它是另一个 DBMS,我会担心,但我对 Informix 很有信心(除非我打错字了)。【参考方案2】:

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

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

为你工作?

【讨论】:

【参考方案3】:

试试下面的

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

【讨论】:

本月如何 >2 和 应该是&lt; MDY(1,1,2013),但答案仍然有效 @swasheck 据我了解,最初的问题是&lt;=2012/01,即包括一月份的所有行?【参考方案4】:
select * from table t where MONTH(t.date) = 12

【讨论】:

例如,列的日期在我的表“用户”中可用,因此只比较该日期列的月份

以上是关于如何将日期(月/年)与另一个日期(月/年)进行比较的主要内容,如果未能解决你的问题,请参考以下文章

我想从 Java 日期中获取年、月、日等,以与 Java 中的公历日期进行比较。这可能吗?

如何计算两个(年-月-日)中间的间隔天数

如何显示与当前日期相比的时差?

JAVA 日期排序

将组合框日期与datadable框进行比较

如何根据 R 中的日期聚合数据?