【问题标题】:Query Database for a specific Month of birthdays查询特定月份生日的数据库
【发布时间】:2011-02-18 18:25:39
【问题描述】:

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

如果有人能提供一些启发,将不胜感激。

附言。我正在使用 PHP 对 MySQL 进行查询。

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

【问题讨论】:

  • 你生日归档的数据类型是什么?

标签: php mysql datetime


【解决方案1】:
select * from table
where Month(column) = 3

如果是字符串

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

【讨论】:

  • 以后请使用正确的代码格式(见我的编辑)
  • @Justin:如果CONTACTS.dob 字段/列上存在索引,则不会使用索引
【解决方案2】:

您可以使用 EXTRACT() 函数。在 WHERE 子句中:

WHERE EXTRACT(MONTH FROM dateColumn) = 3

【讨论】:

  • 如果CONTACTS.dob 字段/列上存在索引,则不会使用索引
【解决方案3】:

您可以使用 SELECT MONTH('2008-02-03') 获取月份编号,将日期替换为您的列。

【讨论】:

  • 如果CONTACTS.dob 字段/列上存在索引,则不会使用索引
【解决方案4】:

“尼克·罗兰多”给出的答案对我有用。

这是我如何解决与您相同的问题的方法:

SELECT date_of_birth FROM customer_id
WHERE EXTRACT(MONTH FROM date_of_birth) = 3;

使用“WHERE”子句,“EXTRACT”函数通过在括号中定义“MONTH”属性来完成所有工作,并且知道如何只提取包含月份的数据:3

出生日期栏也需要有正确的日期格式,例如:“1999-03-29”

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

【讨论】:

  • 这与尼克·罗兰多的答案实际上是一样的,作为评论会更好。
【解决方案5】:

您可以对这些数据进行各种字符串操作,但会很慢。我建议将日期保留在 DATE 列中,加上月份作为单独的 INT 列。这将复制一部分数据,但可以让您有效地查询(尤其是如果您索引月份)。原因:字符串操作比较慢,函数调用不能被索引。

【讨论】:

  • @downvoter:请指出这是不正确的?转换为字符串和后续操作的规模非常大,仅在数千行中问题就会很明显。
  • 不是投反对票的人......但如果我不得不猜测那是因为有一些函数可以简单地从日期时间中提取月份......这使得添加额外的列包含您已经可以轻松检索到的不必要的数据。这有点像拥有名字、姓氏和名字列,而您可以通过简单地组合其他两个来获得名字/姓氏...数据库中不必要的额外信息。
  • @guildsbounty:它们根本没有效率——不可索引(你好,全表扫描先生!)。规范化是一个很好的工具,是的 - 但是“无论性能如何,都要保持一切正常化”只是盲目服从。我曾经不得不做这件事,因为查询中的 MONTH() 将其减慢了两个数量级。我对这种非规范化解决方案不满意,但在 MySQL 允许对特定 DATE 组件进行索引之前(不太可能),这将是最快的。
  • 啊,好吧,我还没有处理到时间因素会开始变得有害的规模。感谢您提供的额外信息,我相信它将来会派上用场。 +1 免费教程
  • 它并不慢,而且您不会在仅仅数千行上看到几乎那么糟糕的性能问题。我要说的是冗余>性能上的轻微成本?我会选择后者。但是我只是在我拥有的有 561,158 行的表上运行了一些测试查询,并且在拉取一个简单的日期列和在 MONTH() 函数中拉取同一列没有任何性能差异。虽然,那可能是因为它输出的文本更少(怀疑,但也许),并且它的补偿完美,但仍然。
猜你喜欢
  • 2020-11-24
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2021-10-08
相关资源
最近更新 更多