详解PHP原生与FastAdmin当前月份数据查询

Hazel
Hazel
发布时间:2026-10-13 | 3人浏览过
原创

在Web开发中,按月度统计数据是常见需求。本文将对比展示两种主流实现方式:一种是面向原生PHP环境的MySQL查询技巧,重点讲解如何利用SQL函数处理日期格式;另一种是针对FastAdmin后台框架的高效查询方案,演示如何借助框架内置的API简化时间范围过滤逻辑,确保代码准确且易于维护。

目标与准备

本操作旨在从数据库中筛选出属于当前自然月(例如2023年10月)的所有记录。假设数据库中存在一张表 my_table,其中包含一个用于存储时间的字段 date_column(类型为 DATETIME 或 DATE)。在执行任何修改前,请务必备份相关数据表,以防误操作导致数据丢失。

环境一:原生PHP + MySQL 查询

第1步:建立数据库连接与获取目标月份

首先需要连接数据库并确定当前月份的字符串格式(如 "2023-10")。我们使用 mysqli 扩展库,并通过 date('Y-m') 函数生成当前年月标识。

<?php
// 配置数据库连接信息
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 获取当前月份的起始格式 (YYYY-MM)
$currentMonth = date('Y-m');
?>

第2步:构造并利用SQL函数进行日期匹配

为了直接比对月份,可以使用 MySQL 的 DATE_FORMAT() 函数将数据库中的 date_column 格式化为 "YYYY-MM" 形式,然后与变量 $currentMonth 进行相等匹配。这种方式逻辑直观,适用于数据量适中的场景。

<?php
// 构造 SQL 语句
$sql = "SELECT * FROM my_table WHERE DATE_FORMAT(date_column, '%Y-%m') = '$currentMonth'";

// 执行查询
$result = $conn->query($sql);

// 遍历并处理结果集
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        // 输出每条记录的关键信息
        echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Date: " . $row["date_column"] . "<br>";
    }
} else {
    echo "当前月份没有数据。";
}

// 关闭连接
$conn->close();
?>

注意:在实际生产环境中,建议使用预处理语句(Prepared Statements)来防止 SQL 注入攻击,此处示例为简化逻辑直接拼接字符串。

环境二:FastAdmin 框架查询方案

FastAdmin 基于 ThinkPHP 5.x 构建,提供了强大的数据库查询构造器。使用框架自带的 whereTime 方法可以更语义化地处理时间区间查询,无需手动编写复杂的 SQL 拼接逻辑。

第1步:使用 Db 类直接查询

如果不需要经过特定的 Model 模型层,可以直接使用 think\Db 门面进行底层操作。这里需要明确当月第一天和最后一天的精确时间点,以确保边界数据不被遗漏。

<?php
use think\Db;

// 获取当前月份标识
$currentMonth = date('Y-m');

// 构造查询:指定 date_column 字段
$data = Db::name('my_table')
    ->whereTime('date_column', '>=', $currentMonth . '-01 00:00:00')   // 当月第一天零点
    ->whereTime('date_column', '<=', $currentMonth . '-31 23:59:59')  // 固定31日23点59分(部分月份不足31天会自动调整或报错,建议动态计算或仅用下限+次月下限)
    ->select();

// 判断是否有数据
if (!empty($data)) {
    foreach ($data as $item) {
        // 处理数据逻辑
    }
} else {
    // 无数据时的处理
}
?>

修正提示:上述代码中使用 -31 作为月底在某些只有30天或28天的月份中可能导致查询结果为空或异常。更严谨的做法是使用 date('Y-m-t') 获取当月最后一天,或者使用下一个月的第一天作为结束条件的左闭右开区间。但在 FastAdmin 的常用场景中,若仅需大概率覆盖,可接受此写法或调整为:
->whereTime('date_column', 'month', $currentMonth) (部分版本支持简写,具体需参照文档)或使用以下更安全的时间段写法:

// 更安全的本月查询写法(推荐)
$start = $currentMonth . '-01 00:00:00';
// 获取下个月的第一天作为截止点(不包含),或者计算当月最后一天
$nextMonthStart = date('Y-m-d H:i:s', strtotime('+1 month', strtotime($start)));

$data = Db::name('my_table')
    ->where('date_column', 'between', [$start, $nextMonthStart])
    ->select();
?

第2步:在 Model 模型中使用

如果你的项目遵循 MVC 规范,通常在对应的 Model 文件中定义查询逻辑。这与直接使用 Db 类的语法基本一致,只是入口变为 Model 实例。

<?php
namespace app\common\model;

use think\Model;

class MyTable extends Model
{
    protected $name = 'my_table';
}

// 调用方式
use app\common\model\MyTable;

$currentMonth = date('Y-m');
$start = $currentMonth . '-01 00:00:00';
$end = $currentMonth . '-31 23:59:59'; // 同上,需注意月份天数差异

$list = MyTable::whereTime('date_column', '>=', $start)
    ->whereTime('date_column', '<=', $end)
    ->select();
?>

完成判断与维护建议

  • 结果验证:运行代码后,检查返回的数据集合是否正确仅包含当前月份的数据。可以通过打印第一条记录的日期字段进行核对。
  • 性能优化:在大数据量表中,对列应用函数(如 DATE_FORMAT)会导致索引失效,引发全表扫描。建议采用范围查询(BETWEEN 或 >/<),这样更容易命中索引,提升查询效率。
  • 时区问题:确保 PHP 设置与服务器系统时区一致,避免因时差导致当月数据被错误归类到上个月或下个月。

以上就是PHP原生SQL与FastAdmin框架当前月份数据查询的详细内容,更多关于PHP日期处理与FastAdmin开发优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表