You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MySQL查询同表中某行日期在另一行起止日期范围内的数据

解决方案

没问题,咱们直接用MySQL来实现这个日期范围的筛选逻辑,不需要PHP额外处理数据。核心思路是通过自连接或者子查询先获取指定id对应的start和end日期,再筛选出date字段落在这个区间内的所有记录。

核心SQL逻辑

首先要注意:你的表中日期是dd/mm/yyyy的字符串格式,MySQL默认的日期比较规则是基于yyyy-mm-dd的,直接用字符串比较会得到错误结果,所以必须用STR_TO_DATE()函数把字符串转换成MySQL可识别的日期类型。

方式1:自连接(推荐,性能更优)

SELECT t.*
FROM your_table t
INNER JOIN your_table target
ON STR_TO_DATE(t.date, '%d/%m/%Y') BETWEEN STR_TO_DATE(target.start, '%d/%m/%Y') AND STR_TO_DATE(target.end, '%d/%m/%Y')
WHERE target.id = '你要指定的id'

方式2:子查询

SELECT t.*
FROM your_table t
JOIN (
    SELECT 
        STR_TO_DATE(start, '%d/%m/%Y') AS target_start,
        STR_TO_DATE(end, '%d/%m/%Y') AS target_end
    FROM your_table
    WHERE id = '你要指定的id'
) AS target_range
ON STR_TO_DATE(t.date, '%d/%m/%Y') BETWEEN target_range.target_start AND target_range.target_end

修改后的PHP函数

另外,原来的函数直接拼接id存在SQL注入风险,建议用$wpdb->prepare()来绑定参数,更安全。修改后的函数如下:

function get($id){
    global $wpdb;
    $table_name = $wpdb->prefix ."myTable";
    // 使用自连接+参数绑定的SQL
    $sql = $wpdb->prepare("
        SELECT t.*
        FROM {$table_name} t
        INNER JOIN {$table_name} target
        ON STR_TO_DATE(t.date, '%d/%m/%Y') BETWEEN STR_TO_DATE(target.start, '%d/%m/%Y') AND STR_TO_DATE(target.end, '%d/%m/%Y')
        WHERE target.id = %d
    ", $id);
    $results = $wpdb->get_results($sql);
    return $results;
}

额外优化建议

如果你的start、end、date字段是MySQL的DATE类型(不是字符串),那可以去掉所有STR_TO_DATE()转换,直接比较,这样查询性能会更好:

SELECT t.*
FROM {$table_name} t
INNER JOIN {$table_name} target
ON t.date BETWEEN target.start AND target.end
WHERE target.id = %d

内容的提问来源于stack exchange,提问作者Mouner Mostafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:34:40