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

如何从当前系统日期提取月份?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:51:55