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

如何用SQL创建含动态当前日期、月份名称、年份的表

动态生成当日日期数据的SQL解决方案

以下针对主流数据库提供实现脚本,满足每日执行时自动插入/更新当日的月份名称、年份、日期数据:

MySQL 版本

1. 创建表结构

先创建存储日期数据的表,用record_date作为主键确保每日仅保留一条记录:

CREATE TABLE IF NOT EXISTS daily_date (
    Month_name VARCHAR(20) NOT NULL,
    Year_name INT NOT NULL,
    day INT NOT NULL,
    record_date DATE PRIMARY KEY
);

2. 插入/更新当日数据

使用REPLACE语句(或INSERT ... ON DUPLICATE KEY UPDATE)实现“存在则更新,不存在则插入”:

-- 方式1:REPLACE 语句
REPLACE INTO daily_date (Month_name, Year_name, day, record_date)
VALUES (
    DATE_FORMAT(CURDATE(), '%M'), -- 获取英文月份全称(如December)
    YEAR(CURDATE()), -- 提取当前年份
    DAY(CURDATE()), -- 提取当前日期
    CURDATE() -- 当日日期作为主键标识
);

-- 方式2:INSERT 冲突更新
INSERT INTO daily_date (Month_name, Year_name, day, record_date)
VALUES (DATE_FORMAT(CURDATE(), '%M'), YEAR(CURDATE()), DAY(CURDATE()), CURDATE())
ON DUPLICATE KEY UPDATE
    Month_name = DATE_FORMAT(CURDATE(), '%M'),
    Year_name = YEAR(CURDATE()),
    day = DAY(CURDATE());

SQL Server 版本

1. 创建表结构

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'daily_date')
CREATE TABLE daily_date (
    Month_name VARCHAR(20) NOT NULL,
    Year_name INT NOT NULL,
    day INT NOT NULL,
    record_date DATE PRIMARY KEY
);

2. 插入/更新当日数据

使用MERGE语句处理冲突逻辑:

MERGE INTO daily_date AS target
USING (
    SELECT
        DATENAME(MONTH, GETDATE()) AS Month_name,
        YEAR(GETDATE()) AS Year_name,
        DAY(GETDATE()) AS day,
        CAST(GETDATE() AS DATE) AS record_date
) AS source
ON target.record_date = source.record_date
WHEN MATCHED THEN
    UPDATE SET
        Month_name = source.Month_name,
        Year_name = source.Year_name,
        day = source.day
WHEN NOT MATCHED THEN
    INSERT (Month_name, Year_name, day, record_date)
    VALUES (source.Month_name, source.Year_name, source.day, source.record_date);

PostgreSQL 版本

1. 创建表结构

CREATE TABLE IF NOT EXISTS daily_date (
    Month_name VARCHAR(20) NOT NULL,
    Year_name INT NOT NULL,
    day INT NOT NULL,
    record_date DATE PRIMARY KEY
);

2. 插入/更新当日数据

使用INSERT ... ON CONFLICT语法处理重复记录:

INSERT INTO daily_date (Month_name, Year_name, day, record_date)
VALUES (
    TO_CHAR(CURRENT_DATE, 'FMMonth'), -- 获取无末尾空格的英文月份名
    EXTRACT(YEAR FROM CURRENT_DATE)::INT,
    EXTRACT(DAY FROM CURRENT_DATE)::INT,
    CURRENT_DATE
)
ON CONFLICT (record_date) DO UPDATE SET
    Month_name = EXCLUDED.Month_name,
    Year_name = EXCLUDED.Year_name,
    day = EXCLUDED.day;

可选:仅插入当日记录(允许重复执行)

如果不需要去重,仅每次执行插入新的当日数据,可去掉主键约束,直接使用简单插入语句(以MySQL为例):

INSERT INTO daily_date (Month_name, Year_name, day)
VALUES (DATE_FORMAT(CURDATE(), '%M'), YEAR(CURDATE()), DAY(CURDATE()));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:57:30