如何从当前系统日期提取月份?SQL查询NOW()用法问题求助
如何从系统日期中提取月份并正确匹配查询
嘿,你踩了一个很常见的SQL小坑哦~咱们先看看你的问题出在哪:
你写的MONTH(audit.created_date)=NOW()是不对的,因为NOW()返回的是完整的当前日期时间(比如2024-05-20 15:40:00),而MONTH()函数返回的是1-12的数字(比如5)。拿数字和完整日期时间做比较,类型完全不匹配,自然查不到任何结果啦。
接下来给你几种正确的写法,根据你的实际需求选:
需求1:统计当前年份的当前月份的记录(最常用)
这是大多数场景的需求,避免把不同年份的同月份数据混在一起。这里有两种写法:
写法1:分别匹配月份和年份
SELECT COUNT(*) FROM `audit` JOIN `user` ON `user`.id = `audit`.`auditor_id` WHERE `audit`.`auditor_id` = 1 AND MONTH(`audit`.`created_date`) = MONTH(NOW()) AND YEAR(`audit`.`created_date`) = YEAR(NOW())
这种写法直观,但因为created_date被函数包裹了,如果这个字段有索引的话,索引会失效,数据量大的时候性能会受影响。
写法2:用范围查询(推荐,性能更好)
这种写法可以利用created_date上的索引,查询效率更高:
SELECT COUNT(*) FROM `audit` JOIN `user` ON `user`.id = `audit`.`auditor_id` WHERE `audit`.`auditor_id` = 1 AND `audit`.`created_date` >= DATE_FORMAT(NOW(), '%Y-%m-01') AND `audit`.`created_date` < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH)
解释一下:
DATE_FORMAT(NOW(), '%Y-%m-01')会得到当月第一天的0点(比如2024-05-01 00:00:00)DATE_ADD(..., INTERVAL 1 MONTH)会得到下个月的第一天,用<而不是<=可以避免包含下个月第一天的0点数据
需求2:统计所有年份中当前月份的记录(少见)
如果你确实需要不管年份,只要是当前月份的所有数据,那可以去掉年份的条件:
SELECT COUNT(*) FROM `audit` JOIN `user` ON `user`.id = `audit`.`auditor_id` WHERE `audit`.`auditor_id` = 1 AND MONTH(`audit`.`created_date`) = MONTH(NOW())
总结一下:核心问题就是你用月份数字和完整日期时间做了不匹配的比较,换成MONTH(NOW())来获取当前月份的数字,再根据是否需要年份条件调整即可,优先推荐范围查询的写法哦~
内容的提问来源于stack exchange,提问作者phani kumar
相关产品推荐
相关产品推荐

