如何用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
相关产品推荐
相关产品推荐

