我在一个客户表中有一个约有1300万行的出生日期DATE列。我想查询此表以查找在该月的某个月和某天出生的所有客户,但任何一年。
我可以通过将日期转换为char并对转换进行下标查询来执行此操作,还是应该创建aditional char列,将其更新为仅保留月份和日期,或者创建三个新的整数列来保存月,日和年分别?
这将是一个非常常用的查询标准......
编辑: ...并且该表有大约1300万行。
您能提供一个最佳解决方案示例吗?
答案 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;