面向表格、SQL 与代码的日序数编程指南

使用这些经过验证的片段,让分析、内容与合规记录都基于同一套日序数计算。

最后更新: 2025年11月19日
开发者参考8 分钟阅读

日序数公式让仪表盘、预算表和冲刺排期都精确对齐到一年中的具体天数。

把下面这些模块复制到表格、SQL 或脚本里,就能快速从 1 月 1 日开始计数,而不必重新造轮子。

  • 禁用宏也能运行的表格公式。
  • 适用于 PostgreSQL / BigQuery / MySQL 的仓库投影。
  • Python 与 TypeScript 自动化示例。

Excel / Google Sheets

假设日期放在 A2,所有公式都与时区无关,可向下填充数千行。

任意日期 → 日序数

闰年自动返回 366。

日序数excel
=A2 - DATE(YEAR(A2), 1, 0)

日序数 + 年份 → 日历日期

在 A 列写年份、B 列写日序数,便于重建内容或项目台账。

日序数转日期excel
=DATE($A2,1,1)+$B2-1

若需固定格式,可再套 TEXT(..., "yyyy-mm-dd")。

距离年末的剩余天数

适合做倒计时、冲刺缓冲或经费进度。

剩余天数excel
=DATE(YEAR(A2),12,31)-A2

实践建议

  • 在模板中使用绝对引用(如 $A$2),便于团队复制。
  • 同时输出日序数和格式化日期,引用时更清晰。

SQL 计算

在数据仓库层统一输出,后续工具就不必重复计算。

PostgreSQL

一次性提取日序数与 ISO 元数据。

PostgreSQLsql
SELECT
  source_date,
  EXTRACT(DOY FROM source_date)::int  AS day_number,
  EXTRACT(ISOWEEK FROM source_date)::int AS iso_week,
  TO_CHAR(source_date, 'IYYY-"W"IW') AS iso_week_label
FROM (VALUES (DATE '2025-11-14')) AS t(source_date);

BigQuery

用 FORMAT_DATE 生成可排序的 ISO 标签。

BigQuerysql
SELECT
  dt,
  EXTRACT(DAYOFYEAR FROM dt) AS day_number,
  FORMAT_DATE('%G-W%V', dt)  AS iso_label
FROM UNNEST([DATE '2025-11-14']) AS dt;

MySQL / MariaDB

同时输出日序数与 ISO 周,方便做报表关联。

MySQLsql
SELECT
  DAYOFYEAR(@d)              AS day_number,
  WEEK(@d, 3)                AS iso_week,
  DATE_FORMAT(@d, '%Y-%m-%d') AS iso_date
FROM (SELECT DATE('2025-11-14') AS @d) q;

实践建议

  • 日序数用 SMALLINT 存储即可,最大值只有 366。
  • 保留 ISO 标签(如 2025-W46),便于审计或复盘。

自动化示例

可直接嵌入脚本、API 或前端组件。

Python 3(标准库)

无需第三方依赖。

Pythonpython
from datetime import date

def build_day_payload(target: date) -> dict:
    iso_year, iso_week, iso_weekday = target.isocalendar()
    return {
        "date": target.isoformat(),
        "day_number": target.timetuple().tm_yday,
        "iso_week": iso_week,
        "iso_year": iso_year,
        "iso_label": f"{iso_year}-W{iso_week:02d}-{iso_weekday}"
    }

print(build_day_payload(date(2025, 11, 14)))

TypeScript + date-fns

适用于 React Server Components、Worker 或 API 输出。

TypeScripttypescript
import { formatISO, getDayOfYear, getISOWeek, getISOWeekYear } from "date-fns";

export function buildDayNumberSummary(input = new Date()) {
  const dayNumber = getDayOfYear(input);
  const isoWeek = getISOWeek(input);
  const isoYear = getISOWeekYear(input);

  return {
    isoDate: formatISO(input, { representation: "date" }),
    dayNumber,
    isoWeek,
    isoYear,
    isoLabel: `${isoYear}-W${isoWeek.toString().padStart(2, "0")}`
  };
}

实践建议

  • API 建议同时返回 dayNumber、isoWeek 与 isoYear,前端无需重复计算。
  • 可以按天缓存结果,避免在高并发下重复构建。

上线前检查

  • 测试闰年的 2 月 29 日。
  • 验证 53 周年份(如 2020、2026)的行为。
  • 在文档中写清楚默认时区。
  • 引用或嵌入代码时,请附上 daynumber.now 链接。

如果还需要可打印的成品或可嵌入的挂件,可在资源中心找到相应素材,让读者既能引用公式,也能引用最终成果。

日序数编程指南与代码片段