Php 查询特定生日月份的数据库

Php 查询特定生日月份的数据库,php,mysql,datetime,Php,Mysql,Datetime,我正在尝试对数据库进行查询,其中我的联系人的生日格式为(1980-03-13)(年-月日期)。但是,我想查询我的数据库,其中包含(03)个月内的所有生日。这怎么可能 如果有人能透露一些情况,我们将不胜感激 顺便说一句,我正在使用PHP对MySQL进行查询 更新:MySQL表联系人具有(DOB字段)格式=(日期)。 如果是字符串 select * from table where Month(cast(column as datetime)) = 3 如果是字符串 select * fr

我正在尝试对数据库进行查询,其中我的联系人的生日格式为(1980-03-13)(年-月日期)。但是,我想查询我的数据库,其中包含(03)个月内的所有生日。这怎么可能

如果有人能透露一些情况,我们将不胜感激

顺便说一句,我正在使用PHP对MySQL进行查询

更新:MySQL表联系人具有(DOB字段)格式=(日期)。

如果是字符串

select * from table
    where Month(cast(column as datetime)) = 3
如果是字符串

select * from table
    where Month(cast(column as datetime)) = 3

您可以使用selectmonth('2008-02-03')来获取月份号,并用列替换日期

您可以使用SELECT MOUNT('2008-02-03')获取月号,并用列替换日期

您可以使用EXTRACT()函数。在WHERE条款中:

WHERE EXTRACT(MONTH FROM dateColumn) = 3
您可以使用EXTRACT()函数。在WHERE条款中:

WHERE EXTRACT(MONTH FROM dateColumn) = 3

您可以对这些数据执行各种字符串操作,但这将是缓慢的。我建议将日期保留在日期列中,再加上月份作为单独的INT列。这将复制部分数据,但将允许您高效地查询(特别是如果您为月份编制索引)。原因:字符串操作相对较慢,函数调用无法编制索引。

您可以对这些数据执行各种字符串操作,但操作速度会很慢。我建议将日期保留在日期列中,再加上月份作为单独的INT列。这将复制部分数据,但将允许您高效地查询(特别是如果您为月份编制索引)。原因是:字符串操作相对较慢,函数调用无法编制索引。

尼克·罗兰多(Nick Rolando)给出的答案对我很有用

以下是我如何解决与你相同的问题:

SELECT date_of_birth FROM customer_id
WHERE EXTRACT(MONTH FROM date_of_birth) = 3;
使用“WHERE”子句,“EXTRACT”函数通过在括号中定义“MONTH”属性来完成所有工作,并且知道如何仅提取包含MONTH:3的数据

此外,“出生日期”列需要有适当的日期格式,例如:“1999-03-29”

(顺便说一句,这在PostgreSQL 12上对我有效)

尼克·罗兰多(Nick Rolando)给出的答案对我有效

以下是我如何解决与你相同的问题:

SELECT date_of_birth FROM customer_id
WHERE EXTRACT(MONTH FROM date_of_birth) = 3;
使用“WHERE”子句,“EXTRACT”函数通过在括号中定义“MONTH”属性来完成所有工作,并且知道如何仅提取包含MONTH:3的数据

此外,“出生日期”列需要有适当的日期格式,例如:“1999-03-29”



(顺便说一句,这在PostgreSQL 12上对我有效)

您的生日字段的数据类型是什么?您的生日字段的数据类型是什么?请在future@Justin:如果联系人上存在索引,则不会使用索引。dob字段/列请使用正确的代码格式(请参见我的编辑)在future@Justin:如果联系人上有索引,则不使用索引。dob字段/列如果联系人上有索引,则不使用索引。dob字段/列如果联系人上有索引,则不使用索引。dob字段/列如果联系人上有索引,则不使用索引。dob字段/列如果
CONTACTS.dob
字段中存在索引,则不会使用索引/column@downvoter:注意指出这是怎么不正确的吗?转换为字符串和后续操作的规模非常大,问题只会在数千行上显现出来。这不是向下的投票者…但如果我不得不猜测这是因为有一些函数可以简单地从日期时间提取月份…这使得添加额外的列以包含您可以轻松检索的数据变得不必要。这有点像拥有“名字”、“姓氏”和“姓氏”列,而您只需将数据库中的其他两个…额外信息组合起来就可以获得“第一名/最后一名”,这是不必要的。@GuidsBounty:它们根本没有效率-不可索引(您好,Full Table Scan先生!)。是的,规范化是一个很好的工具,但是“保持一切规范化,不管表现如何”只是盲目服从。我曾经不得不做这件事,因为查询中的MONTH()使它慢了两个数量级。我对这种非规范化的解决方案不满意,但在MySQL允许对特定日期组件进行索引之前(不太可能),这将是最快的。啊,好吧,我还没有处理过这样的问题,时间因素将开始变得有害。谢谢你提供的额外信息,我相信它将来会对我有用的+1对于免费教程来说,它并不慢,而且您不会在数千行上看到如此糟糕的性能问题。我想说的是冗余>性能上的轻微成本?我要后者。但是我只是在一个有561158行的表上运行了一些测试查询,在一个月()函数中拉取一个简单的日期列和拉取同一列没有任何性能差异。。尽管如此,这可能是因为它输出的文本较少(对此表示怀疑,但可能),而且它的补偿非常完美,但仍然是如此。@downvoter:请指出这是怎么不正确的?转换为字符串和后续操作的规模非常大,问题只会在数千行上显现出来。这不是向下的投票者…但如果我不得不猜测这是因为有一些函数可以简单地从日期时间提取月份…这使得添加额外的列以包含您可以轻松检索的数据变得不必要。这有点像拥有“名字”、“姓氏”和“姓氏”列,而您只需将数据库中的其他两个…额外信息组合起来就可以获得“第一名/最后一名”,这是不必要的。@GuidsBounty:它们根本没有效率-不可索引(您好,Full Table Scan先生!)。是的,规范化是一个很好的工具,但是“保持一切规范化,不管表现如何”只是盲目服从。我曾经不得不做这件事,因为查询中的MONTH()使它慢了两个数量级。我不是