如何只查询DATE列的月份和日期?

时间:2012-12-14 04:15:44

标签: sql date casting informix

我在一个客户表中有一个约有1300万行的出生日期DATE列。我想查询此表以查找在该月的某个月和某天出生的所有客户,但任何一年。

我可以通过将日期转换为char并对转换进行下标查询来执行此操作,还是应该创建aditional char列,将其更新为仅保留月份和日期,或者创建三个新的整数列来保存月,日和年分别?

这将是一个非常常用的查询标准......

编辑: ...并且该表有大约1300万行。

您能提供一个最佳解决方案示例吗?

2 个答案:

答案 0 :(得分:2)

根据您执行此操作的频率以及运行速度,您可能会考虑将日期列拆分为日,月和年列。这会使搜索更快,但当你想要检索一个完整的日期(以及验证它是一个日期的问题)时会引起各种其他问题 - 这不是一个好主意。

假设速度不是探测器,我会做类似的事情:

select *
FROM Table
WHERE Month(*DateOfBirthColumn*) = *SomeMonth* AND DAY(*DateOfBirthColumn*) = *SomeDay*

我目前没有在我面前使用informix,但我认为语法是正确的。

答案 1 :(得分:2)

如果经常使用,请考虑'functional index'。在Informix 11.70 InfoCentre中搜索该术语会产生许多相关的命中。

您可以使用:

WHERE MONTH(date_col) = 12 AND DAY(date_col) = 25;

你也可以玩游戏,如:

WHERE MONTH(date_col) * 100 + DAY(date_col) = 1225;

这可能更适合功能索引,但对于日常使用不太清楚。您也可以轻松编写存储过程:

请注意,在缺少功能索引的情况下,在标准中调用列上的函数意味着不太可能使用索引。

CREATE FUNCTION mmdd(date_val DATE DEFAULT TODAY) RETURNING SMALLINT AS mmdd;
    RETURN MONTH(date_val) * 100 + DAY(date_val);
END FUNCTION;

并将其用作:

WHERE mmdd(date_col) = 1225;