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

如何按月份统计注册用户数?毫秒时间戳查询无结果求助

毫秒级时间戳统计年度月度注册量问题排查与解决

你的查询返回空结果的核心原因是:YEAR() 和 MONTH() 函数仅支持日期/时间类型的输入,但你的createDate是存储为BIGINT的毫秒级时间戳(纯数字值),直接传入这些函数会被当作普通整数处理,完全无法匹配2023年的日期范围,自然没有数据返回。

以下是不同数据库场景下的解决办法:

MySQL 解决方案

需要先将毫秒时间戳转换为日期类型,MySQL的FROM_UNIXTIME()函数默认处理秒级时间戳,因此要先把毫秒值除以1000:

基础修正版

SELECT 
  MONTH(FROM_UNIXTIME(createDate/1000)) AS 月份, 
  COUNT(*) AS 注册总量
FROM users
WHERE YEAR(FROM_UNIXTIME(createDate/1000)) = 2023
GROUP BY MONTH(FROM_UNIXTIME(createDate/1000))
ORDER BY 月份;

大数据量优化版

如果用户表数据量较大,直接在WHERE子句使用函数会触发全表扫描。可以提前计算2023年的毫秒时间戳范围,用范围查询利用索引:

  • 2023年1月1日0点的毫秒戳:1672531200000
  • 2023年12月31日23:59:59的毫秒戳:1704067199999
SELECT 
  MONTH(FROM_UNIXTIME(createDate/1000)) AS 月份, 
  COUNT(*) AS 注册总量
FROM users
WHERE createDate BETWEEN 1672531200000 AND 1704067199999
GROUP BY MONTH(FROM_UNIXTIME(createDate/1000))
ORDER BY 月份;

PostgreSQL 解决方案

PostgreSQL使用TO_TIMESTAMP()函数转换秒级时间戳,同样需要先将毫秒值除以1000:

基础修正版

SELECT 
  EXTRACT(MONTH FROM TO_TIMESTAMP(createDate/1000)) AS 月份, 
  COUNT(*) AS 注册总量
FROM users
WHERE EXTRACT(YEAR FROM TO_TIMESTAMP(createDate/1000)) = 2023
GROUP BY EXTRACT(MONTH FROM TO_TIMESTAMP(createDate/1000))
ORDER BY 月份;

大数据量优化版

用毫秒时间戳范围查询提升效率:

SELECT 
  EXTRACT(MONTH FROM TO_TIMESTAMP(createDate/1000)) AS 月份, 
  COUNT(*) AS 注册总量
FROM users
WHERE createDate BETWEEN 1672531200000 AND 1704067199999
GROUP BY EXTRACT(MONTH FROM TO_TIMESTAMP(createDate/1000))
ORDER BY 月份;

内容的提问来源于stack exchange,提问作者Chris Hansen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:40:32