如何将按月查询用户生日的SQL改为按日期范围查询?
解决方案:按日期范围查询用户
没问题,我来帮你搞定这个日期范围查询的需求!首先得明确你要的是两种情况中的哪一种,我都会给你对应的SQL和PHP实现:
情况1:查询出生日期(含年份)在指定区间内的用户
如果你的需求是找出出生日期刚好落在$fromdate到$todate之间的用户(比如只找1990年3月9日到20日出生的人),可以用BETWEEN关键字,同时注意把PHP里的日期字符串转换成SQL能识别的DATE类型:
SELECT * FROM register WHERE dob BETWEEN STR_TO_DATE(?, '%d-%b-%Y') AND STR_TO_DATE(?, '%d-%b-%Y')
这里用STR_TO_DATE(?, '%d-%b-%Y')来解析你提供的09-Mar-2018格式的日期,%d代表日,%b代表英文月份缩写,%Y代表4位年份。
情况2:查询生日(月日)落在指定区间内的用户(忽略年份)
如果你的需求和原来的“当月过生日”类似,只是缩小到一个日期区间(比如不管哪年出生,只要生日在3月9日到20日之间),那需要提取出生日期的月日部分来比较:
SELECT * FROM register WHERE DATE_FORMAT(dob, '%m-%d') BETWEEN DATE_FORMAT(STR_TO_DATE(?, '%d-%b-%Y'), '%m-%d') AND DATE_FORMAT(STR_TO_DATE(?, '%d-%b-%Y'), '%m-%d')
特殊情况:日期范围跨年度
如果你的日期范围跨了年份(比如从12月25日到次年1月5日),上面的BETWEEN会失效(因为12-25比01-05大),这时候需要用OR来处理:
SELECT * FROM register WHERE DATE_FORMAT(dob, '%m-%d') >= DATE_FORMAT(STR_TO_DATE(?, '%d-%b-%Y'), '%m-%d') OR DATE_FORMAT(dob, '%m-%d') <= DATE_FORMAT(STR_TO_DATE(?, '%d-%b-%Y'), '%m-%d')
PHP代码示例(用PDO实现参数化查询)
为了避免SQL注入,强烈建议用参数化查询,而不是直接把PHP变量拼到SQL里。下面是PDO的示例代码:
// 假设你已经建立了PDO连接,$pdo是连接实例 $fromdate = '09-Mar-2018'; $todate = '20-Mar-2018'; // 情况1:查询出生日期在区间内的用户 $sql1 = "SELECT * FROM register WHERE dob BETWEEN STR_TO_DATE(?, '%d-%b-%Y') AND STR_TO_DATE(?, '%d-%b-%Y')"; $stmt1 = $pdo->prepare($sql1); $stmt1->execute([$fromdate, $todate]); $usersInDateRange = $stmt1->fetchAll(PDO::FETCH_ASSOC); // 情况2:查询生日月日在区间内的用户 $sql2 = "SELECT * FROM register WHERE DATE_FORMAT(dob, '%m-%d') BETWEEN DATE_FORMAT(STR_TO_DATE(?, '%d-%b-%Y'), '%m-%d') AND DATE_FORMAT(STR_TO_DATE(?, '%d-%b-%Y'), '%m-%d')"; $stmt2 = $pdo->prepare($sql2); $stmt2->execute([$fromdate, $todate]); $birthdayUsers = $stmt2->fetchAll(PDO::FETCH_ASSOC);
内容的提问来源于stack exchange,提问作者user9341437
相关产品推荐
相关产品推荐

