如何从数据库获取当前周的毫秒级时间戳数据?
提取数据库中当前周的毫秒级时间戳数据
下面针对主流数据库给出具体实现方案,适配毫秒级时间戳的场景:
MySQL/MariaDB
先把毫秒时间戳转成秒级,再转成日期格式,然后匹配当前周和年份(避免跨年时的周数冲突):
SELECT * FROM your_table WHERE WEEK(FROM_UNIXTIME(your_timestamp / 1000)) = WEEK(CURDATE()) AND YEAR(FROM_UNIXTIME(your_timestamp / 1000)) = YEAR(CURDATE());
如果你的业务以周一作为一周的起始日,修改WEEK函数的第二个参数为1即可:
WEEK(FROM_UNIXTIME(your_timestamp / 1000), 1) = WEEK(CURDATE(), 1)
PostgreSQL
用TO_TIMESTAMP将毫秒时间戳转成可识别的日期,再提取周数和年份做匹配:
SELECT * FROM your_table WHERE EXTRACT(WEEK FROM TO_TIMESTAMP(your_timestamp / 1000)) = EXTRACT(WEEK FROM CURRENT_DATE) AND EXTRACT(YEAR FROM TO_TIMESTAMP(your_timestamp / 1000)) = EXTRACT(YEAR FROM CURRENT_DATE);
如果需要遵循ISO周标准(周一为起始),把WEEK替换成ISOWEEK即可:
EXTRACT(ISOWEEK FROM TO_TIMESTAMP(your_timestamp / 1000)) = EXTRACT(ISOWEEK FROM CURRENT_DATE)
SQL Server
通过DATEADD把毫秒时间戳转成datetime类型,再提取周数和年份:
SELECT * FROM your_table WHERE DATEPART(WEEK, DATEADD(ms, your_timestamp, '1970-01-01')) = DATEPART(WEEK, GETDATE()) AND DATEPART(YEAR, DATEADD(ms, your_timestamp, '1970-01-01')) = DATEPART(YEAR, GETDATE());
要设置周一为一周起始日,先执行SET DATEFIRST 1;再运行查询。
MongoDB
用$toDate直接解析毫秒时间戳,再通过$week和$year匹配当前周数据:
db.your_collection.find({ $expr: { $and: [ { $eq: [{ $week: { $toDate: "$your_timestamp" } }, { $week: new Date() }] }, { $eq: [{ $year: { $toDate: "$your_timestamp" } }, { $year: new Date() }] } ] } })
如果需要ISO周(周一起始),把$week换成$isoWeek即可。
注意事项
- 时区适配:如果数据库和应用时区不一致,要在时间转换时指定时区,比如MySQL的
FROM_UNIXTIME支持时区参数,PostgreSQL/SQL Server用AT TIME ZONE语法,避免出现数据偏差。 - 跨年场景:必须结合年份判断,不然会把去年同周的数据也捞出来,影响图表准确性。
内容的提问来源于stack exchange,提问作者Mark Delphi
相关产品推荐
相关产品推荐

