【发布时间】: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 中检索确切的范围,您将获得更好的性能,因为您不需要检索和操作中的每一行桌子。这也允许在列上创建索引。