我在一个大约 1300 万行的客户表中有一个出生日期 DATE 列。我想查询此表以查找在该月的某个月某日出生但任何年份的所有客户。
我可以通过将日期转换为 char 并对转换进行下标查询来做到这一点,还是应该创建一个附加的 char 列,将其更新为仅保存月份和日期,或者创建三个新的整数列来保存月份、日期和年份,分别?
这将是一个非常常用的查询条件...
编辑: ...并且该表有约 1300 万行。
您能否提供一个最佳解决方案的示例?
根据您执行此操作的频率以及它需要运行的速度,您可能会考虑将日期列拆分为日、月和年列。这将使搜索更快,但当您想要检索整个日期时会导致各种其他问题(以及验证它是否是日期的问题) - 这不是一个好主意。
假设速度不是问题,我会做类似的事情:
select *
FROM Table
WHERE Month(*DateOfBirthColumn*) = *SomeMonth* AND DAY(*DateOfBirthColumn*) = *SomeDay*
目前我面前没有informix,但我认为语法是正确的。
如果会经常使用,请考虑使用“功能索引”。在 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;