【问题标题】:How can I use DATE_FORMAT() with year and month如何使用带有年份和月份的 DATE_FORMAT()
【发布时间】:2022-01-12 11:37:50
【问题描述】:

原文出处:

public function getChargeData($company_id,$month)
{
    $sql = "select * from foo_records where DATE_FORMAT(bar_date,'%m')  = $month";
    $chargeList = \DB::select($sql);
    return $chargeList;
}

这个函数可以获取一整月的数据。

但是,它不按年份过滤;它应该按年份过滤,因为它也在选择 2022 年同月的记录。

我尝试制作这样的功能。但它没有用。没有未提取的记录:

public function getData($year,$month)
{
    $sql = "select * from foo_records where DATE_FORMAT(bar_date,'%Y'-'%m')  = ".$year."-".$month;
}

bar_date 列是 DATETIME 类型:

2021-08-13 00:00:00
2021-08-14 00:00:00
2021-08-20 00:00:00
2021-08-25 00:00:00
2021-08-31 00:00:00
2021-09-01 00:00:00
2021-09-03 00:00:00
2021-09-15 00:00:00
2021-09-25 00:00:00

当 $year = 2021, $month = 08 时,预期结果为:

2021-08-13 00:00:00
2021-08-14 00:00:00
2021-08-20 00:00:00
2021-08-25 00:00:00
2021-08-31 00:00:00

【问题讨论】:

  • 除了在 PHP 中创建字符串变量之外,您是否做过任何其他事情。您必须让数据库运行该查询,然后获取结果集。不涉及魔法
  • 请从阅读PHP Manual for the PDO Database extension 开始,它提供了完整的示例和各种帮助。多少钱research effort is expected of Stack Overflow users?
  • DATE_FORMAT 想要一个字符串值作为第二个参数。出于某种原因,您正试图将数学表达式传递给它。但我不知道您期望“文本%Y 减去文本%m”的结果是什么,而数据库可能也不会。
  • 您可能正在使用 MySQL。 '%Y'-'%m' 应该会导致错误,因为您不能从另一个字符串中减去一个字符串。在这方面一个好的 DBMS 会发出一条错误消息来解释这一点。然而,MySQL 将字符串转换为数字,默认为 0,因为字符串不包含数字。因此,您得到 0 - 0 = 0。DBMS 现在应该以最佳方式告诉您,您正在使用无效格式字符串调用DATE_FORMAT(0 被转换为“0”),但是,MySQL 认为这是有效的;它假定您想要一个常量“0”,而不管 bar_date 值如何。
  • 对于它的价值,如果您只在 PHP 中计算开始和结束日期并在 SQL 中检索确切的范围,您将获得更好的性能,因为您不需要检索和操作中的每一行桌子。这也允许在列上创建索引。

标签: php sql datetime


【解决方案1】:

发送到服务器的查询如下所示:

WHERE DATE_FORMAT(bar_date,'%Y'-'%m') = 2021-01

这显然不起作用,因为'%Y'-'%m' 的结果为 0,2021-01 是 2020。我建议不要将' 放在正确的位置,而是建议:

WHERE bar_date >= '2021-06-01'
AND   bar_date <  '2021-06-01' + INTERVAL 1 MONTH

其中202106 是您的$year$month 变量,而-01+ INTERVAL 1 MONTH 是硬编码的。

【讨论】:

  • @flow Stack:Salman A 提出此表达式是为了不调用 bar_date 上的函数,从而使 DBMS 能够使用该列上的索引(如果可用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多