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

当前与上一自然年度营收对比图表日期编码实现咨询

跨年度营收同比对比日期获取实现方案

以下方案覆盖后端开发、前端图表渲染、数据库查询三类常用场景,同时适配「完整自然年对比」「截止到今日的当年/上年同期对比」两种需求:


Python 实现(基于标准库 datetime)

from datetime import datetime, date

# 获取当前日期
today = date.today()
current_year = today.year
last_year = current_year - 1

# 场景1:完整自然年起止
current_year_start = date(current_year, 1, 1)
current_year_end = date(current_year, 12, 31)
last_year_start = date(last_year, 1, 1)
last_year_end = date(last_year, 12, 31)

# 场景2:截止到今日的同期对比(上年结束日期为去年今日)
# 处理闰年2月29日特殊情况
try:
    last_year_today = date(last_year, today.month, today.day)
except ValueError:
    # 当年是闰年且今日为2月29日,上年同期取2月28日
    last_year_today = date(last_year, 2, 28)

current_period_start = current_year_start
current_period_end = today
last_period_start = last_year_start
last_period_end = last_year_today

SQL 实现(兼容MySQL/PostgreSQL)

可直接在数据查询阶段计算时间范围,无需额外代码处理:

-- 当年1月1日
SELECT DATE_FORMAT(CURDATE(), '%Y-01-01') AS current_year_start;
-- 当年今日
SELECT CURDATE() AS current_year_end;
-- 上年1月1日
SELECT DATE_FORMAT(CURDATE() - INTERVAL 1 YEAR, '%Y-01-01') AS last_year_start;
-- 上年今日(自动处理闰年问题)
SELECT DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AS last_year_end;

-- 月度营收同比查询示例
SELECT 
    DATE_FORMAT(create_time, '%Y-%m') AS month,
    SUM(amount) AS current_year_revenue,
    (SELECT SUM(amount) FROM revenue 
     WHERE create_time BETWEEN DATE_SUB(DATE_FORMAT(create_time, '%Y-%m-01'), INTERVAL 1 YEAR) 
     AND LAST_DAY(DATE_SUB(create_time, INTERVAL 1 YEAR))) AS last_year_revenue
FROM revenue
WHERE create_time >= DATE_FORMAT(CURDATE(), '%Y-01-01')
GROUP BY month;

JavaScript 实现(前端图表渲染用)

const today = new Date();
const currentYear = today.getFullYear();
const lastYear = currentYear - 1;

// 完整自然年起止
const currentYearStart = new Date(currentYear, 0, 1);
const currentYearEnd = new Date(currentYear, 11, 31);
const lastYearStart = new Date(lastYear, 0, 1);
const lastYearEnd = new Date(lastYear, 11, 31);

// 截止到今日的同期对比
const lastYearToday = new Date(lastYear, today.getMonth(), today.getDate());
// 闰年兼容:如果JS自动把2月29日转到3月1日,强制修正为上年2月28日
if (lastYearToday.getMonth() !== today.getMonth()) {
    lastYearToday.setMonth(today.getMonth(), 28);
}

注意事项

  • 统计营收时建议将结束时间的时分秒设为23:59:59,避免漏掉当日最后生成的订单数据
  • 若需按周/季度维度同比,只需将日期的起止值替换为对应周期的首尾即可,逻辑完全通用
  • 如涉及多时区数据,需统一转换为业务所在时区后再计算日期范围,避免统计偏差

内容的提问来源于stack exchange,提问作者A Kwarts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:15:04