主流SQL数据库日期转字符串的语法(MySQL、SQL Server、Oracle等
wptr33 2025-10-14 06:13 1 浏览
下面对主流SQL数据库(MySQL、SQL Server、Oracle、PostgreSQL、SQLite)日期转字符串的方法进行详细对比拆解,包含基础语法结构、参数解析、返回值说明及完整模拟示例,仅供参考。
一、基本概念
1. 作用
将日期(DATE)、时间(TIME)或日期时间(DATETIME/TIMESTAMP)类型的值按照指定的格式转换为字符串。这在生成报表、数据导出、日志记录、API接口响应、日期部分提取等场景中比较常见。
2. 差异点
- 函数命名差异:各数据库使用不同的函数名(如DATE_FORMAT、TO_CHAR、CONVERT等)
- 格式字符串定义:各数据库使用不同的占位符(如%Y、YYYY、yyyy等代表四位年份)
- 返回值类型:通常为字符串类型(VARCHAR、TEXT等)
二、语法对比解析
1. MySQL
基础语法
DATE_FORMAT(date, format)
- 参数
- date:日期/时间值(DATE/DATETIME/TIMESTAMP)
- format:格式字符串(使用%前缀的占位符)
- 返回值:格式化后的字符串(VARCHAR)
格式符拆解
占位符 | 含义 | 示例输出 |
%Y | 四位年份 | 2023 |
%y | 两位年份 | 23 |
%m | 两位月份(01-12) | 07 |
%c | 月份(1-12) | 7 |
%d | 两位日期(01-31) | 05 |
%e | 日期(1-31) | 5 |
%H | 24小时制小时 | 14 |
%h | 12小时制小时 | 02 |
%i | 分钟(00-59) | 05 |
%s | 秒(00-59) | 30 |
%p | AM/PM | PM |
%W | 完整星期名 | Monday |
%a | 缩写星期名 | Mon |
%M | 完整月份名 | July |
%b | 缩写月份名 | Jul |
模拟示例
-- 创建订单表
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_date DATETIME NOT NULL,
amount DECIMAL(10,2)
);
-- 插入测试数据
INSERT INTO orders (order_date, amount) VALUES
('2023-07-05 14:30:45', 99.99),
('2023-12-25 09:15:30', 149.50),
(NOW(), 75.25); -- 当前时间
-- 格式化日期输出
SELECT
order_id,
DATE_FORMAT(order_date, '%Y-%m-%d') AS order_date_short,
DATE_FORMAT(order_date, '%W, %M %e, %Y %h:%i %p') AS order_date_long,
DATE_FORMAT(order_date, '订单日期:%Y年%m月%d日') AS order_date_cn
FROM orders;
输出结果:
order_id | order_date_short | order_date_long | order_date_cn
---------|------------------|------------------------------|-------------------
1 | 2023-07-05 | Wednesday, July 5, 2023 02:30 PM | 订单日期:2023年07月05日
2 | 2023-12-25 | Monday, December 25, 2023 09:15 AM | 订单日期:2023年12月25日
3 | 2023-08-15 | Tuesday, August 15, 2023 10:45 AM | 订单日期:2023年08月15日
2. SQL Server
基础语法
-- 传统方法
CONVERT(VARCHAR, date, style_code)
-- 现代方法(2012+)
FORMAT(date, format [, culture])
- 参数
- date:日期值
- format:.NET风格格式字符串
- culture(可选):区域设置(如'zh-CN')
- VARCHAR:目标类型
- date:日期值
- style_code:预定义格式代码
- CONVERT:
- FORMAT:
- 返回值:格式化字符串(NVARCHAR)
CONVERT样式代码:
代码 | 格式 | 示例 |
101 | mm/dd/yyyy | 07/05/2023 |
102 | yyyy.mm.dd | 2023.07.05 |
103 | dd/mm/yyyy | 05/07/2023 |
104 | dd.mm.yyyy | 05.07.2023 |
105 | dd-mm-yyyy | 05-07-2023 |
112 | yyyymmdd | 20230705 |
114 | hh:mi:ss:mmm(24h) | 14:30:45:000 |
120 | yyyy-mm-dd hh:mi:ss | 2023-07-05 14:30:45 |
FORMAT格式符:
占位符 | 含义 | 示例 |
yyyy | 四位年份 | 2023 |
MM | 两位月份 | 07 |
dd | 两位日期 | 05 |
HH | 24小时制小时 | 14 |
hh | 12小时制小时 | 02 |
mm | 分钟 | 30 |
ss | 秒 | 45 |
tt | AM/PM | PM |
dddd | 完整星期名 | Wednesday |
MMMM | 完整月份名 | July |
模拟示例
-- 创建日志表
CREATE TABLE server_logs (
log_id INT IDENTITY PRIMARY KEY,
log_time DATETIME,
message NVARCHAR(200)
);
INSERT INTO server_logs (log_time, message) VALUES
('2023-07-05T14:30:45', 'Server started'),
(GETDATE(), 'User login');
-- 传统CONVERT方法
SELECT
log_id,
CONVERT(VARCHAR, log_time, 120) AS iso_format,
CONVERT(VARCHAR, log_time, 106) AS text_format -- dd mon yyyy
FROM server_logs;
-- 现代FORMAT方法
SELECT
log_id,
FORMAT(log_time, 'yyyy-MM-dd HH:mm:ss') AS iso_format,
FORMAT(log_time, 'dddd, MMMM dd, yyyy hh:mm tt') AS long_format,
FORMAT(log_time, 'yyyy年MM月dd日 HH时mm分', 'zh-CN') AS cn_format
FROM server_logs;
输出结果:
log_id | iso_format | long_format | cn_format
-------|----------------------|----------------------------------|-------------------
1 | 2023-07-05 14:30:45 | Wednesday, July 05, 2023 02:30 PM | 2023年07月05日 14时30分
2 | 2023-08-15 10:45:30 | Tuesday, August 15, 2023 10:45 AM | 2023年08月15日 10时45分
3. Oracle
基础语法
TO_CHAR(date, format [, nls_params])
- 参数
- date:DATE/TIMESTAMP值
- format:格式字符串
- nls_params(可选):语言设置(如'NLS_DATE_LANGUAGE=FRENCH')
- 返回值:格式化字符串(VARCHAR2)
格式符拆解:
占位符 | 含义 | 示例 |
YYYY | 四位年份 | 2023 |
YEAR | 年份英文拼写 | TWENTY-THREE |
MM | 两位月份 | 07 |
MON | 缩写月份名 | JUL |
MONTH | 完整月份名 | JULY |
DD | 两位日期 | 05 |
DDD | 年内的天数 | 186 |
HH24 | 24小时制小时 | 14 |
HH12 | 12小时制小时 | 02 |
MI | 分钟 | 30 |
SS | 秒 | 45 |
AM | AM/PM | PM |
DAY | 完整星期名 | WEDNESDAY |
DY | 缩写星期名 | WED |
模拟示例
-- 创建员工表
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
hire_date DATE,
salary NUMBER
);
INSERT INTO employees VALUES
(101, TO_DATE('2023-07-05', 'YYYY-MM-DD'), 5000),
(102, SYSDATE, 6000); -- 当前日期
-- 基础格式化
SELECT
emp_id,
TO_CHAR(hire_date, 'YYYY-MM-DD') AS iso_date,
TO_CHAR(hire_date, 'DD/MM/YYYY HH24:MI') AS eu_format
FROM employees;
-- 高级格式化(带语言参数)
SELECT
emp_id,
TO_CHAR(hire_date, 'YEAR-MONTH-DD') AS text_date, -- TWENTY-THREE-JULY-05
TO_CHAR(hire_date, 'Day, DD Month YYYY', 'NLS_DATE_LANGUAGE=FRENCH') AS french_date,
TO_CHAR(hire_date, '"入职日期:"YYYY"年"MM"月"DD"日"') AS cn_custom
FROM employees;
输出结果:
emp_id | iso_date | eu_format | text_date | french_date | cn_custom
-------|-------------|-------------------|-------------------------|------------------------------|-------------------
101 | 2023-07-05 | 05/07/2023 00:00 | TWENTY-THREE-JULY-05 | Mercredi, 05 Juillet 2023 | 入职日期:2023年07月05日
102 | 2023-08-15 | 15/08/2023 00:00 | TWENTY-THREE-AUGUST-15 | Mardi, 15 Ao^ut 2023 | 入职日期:2023年08月15日
4. PostgreSQL
基础语法
TO_CHAR(timestamp, format)
- 参数
- timestamp:DATE/TIMESTAMP/TIMESTAMPTZ值
- format:格式字符串(类似Oracle)
- 返回值:格式化字符串(TEXT)
格式符(与Oracle高度兼容):
占位符 | 含义 | 示例 |
YYYY | 四位年份 | 2023 |
MM | 两位月份 | 07 |
DD | 两位日期 | 05 |
HH24 | 24小时制小时 | 14 |
MI | 分钟 | 30 |
SS | 秒 | 45 |
AM | AM/PM | PM |
Day | 完整星期名 | Wednesday |
Mon | 缩写月份名 | Jul |
FMDay | 无空格星期名 | Wednesday |
"文本" | 原样输出文本 | "Date:" |
模拟示例
-- 创建事件表
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
event_name VARCHAR(100),
event_time TIMESTAMPTZ
);
INSERT INTO events (event_name, event_time) VALUES
('Conference', '2023-07-05 14:30:45+00'),
('Workshop', NOW());
-- 基础格式化
SELECT
event_id,
TO_CHAR(event_time, 'YYYY-MM-DD HH24:MI:SS') AS iso_format,
TO_CHAR(event_time, 'FMDay, FMMonth DD, YYYY') AS long_date -- FM去除填充空格
FROM events;
-- 时区转换+格式化
SELECT
event_id,
TO_CHAR(event_time AT TIME ZONE 'Asia/Shanghai',
'YYYY-MM-DD HH24:MI:SS TZ') AS shanghai_time
FROM events;
输出结果:
event_id | iso_format | long_date | shanghai_time
---------|----------------------|-----------------------------|-------------------------
1 | 2023-07-05 14:30:45 | Wednesday, July 5, 2023 | 2023-07-05 22:30:45 CST
2 | 2023-08-15 03:45:10 | Tuesday, August 15, 2023 | 2023-08-15 11:45:10 CST
5. SQLite
基础语法
STRFTIME(format, timestring [, modifier...])
- 参数
- format:格式字符串(%前缀)
- timestring:日期字符串(ISO8601格式)
- modifier:时间修饰符(如'+1 day')
- 返回值:格式化字符串(TEXT)
格式符拆解:
占位符 | 含义 | 示例 |
%Y | 四位年份 | 2023 |
%m | 两位月份 | 07 |
%d | 两位日期 | 05 |
%H | 24小时制小时 | 14 |
%M | 分钟 | 30 |
%S | 秒 | 45 |
%w | 星期数字(0-6) | 3(周三) |
%j | 年内的天数 | 186 |
%W | 年内的周数 | 27 |
%s | Unix时间戳 | 1688567445 |
模拟示例
-- 创建会议表
CREATE TABLE meetings (
meeting_id INTEGER PRIMARY KEY,
title TEXT,
start_time TEXT, -- ISO8601格式存储
end_time TEXT
);
INSERT INTO meetings VALUES
(1, 'Q3 Planning', '2023-07-05 14:30:00', '2023-07-05 16:00:00'),
(2, 'Team Sync', datetime('now'), datetime('now', '+1 hour'));
-- 基础格式化
SELECT
meeting_id,
STRFTIME('%Y-%m-%d', start_time) AS short_date,
STRFTIME('%H:%M', start_time) AS start_time_only
FROM meetings;
-- 高级格式化
SELECT
title,
STRFTIME('%Y年%m月%d日 %H时%M分', start_time) AS cn_start,
STRFTIME('会议时长:%H小时%M分钟',
STRFTIME('%s', end_time) - STRFTIME('%s', start_time),
'unixepoch') AS duration -- 计算持续时间
FROM meetings;
输出结果:
title | cn_start | duration
------------|-----------------------|-------------------
Q3 Planning | 2023年07月05日 14时30分 | 会议时长:01小时30分钟
Team Sync | 2023年08月15日 11时45分 | 会议时长:01小时00分钟
三、跨数据库对比总结表
特性 | MySQL | SQL Server | Oracle | PostgreSQL | SQLite |
主要函数 | DATE_FORMAT | CONVERT/FORMAT | TO_CHAR | TO_CHAR | STRFTIME |
格式前缀 | % | 无/.NET格式 | 无 | 无 | % |
语言本地化 | 有限 | FORMAT支持 | TO_CHAR支持 | 有限 | 无 |
时区处理 | 无 | 有限 | 有 | 完善 | 无 |
数字填充 | 自动补零 | 自动补零 | 自动补零 | 自动补零 | 自动补零 |
文本输出 | 支持 | 支持 | 支持 | 支持 | 支持 |
Unix时间戳 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
(表格可左右滚动)
四、进阶应用示例
场景:生成多语言报表
-- Oracle示例(支持多语言切换)
SELECT
employee_id,
TO_CHAR(hire_date, 'YYYY"年"MM"月"DD"日"', 'NLS_DATE_LANGUAGE=TRADITIONAL CHINESE') AS zh_date,
TO_CHAR(hire_date, 'Month DD, YYYY', 'NLS_DATE_LANGUAGE=JAPANESE') AS jp_date,
TO_CHAR(hire_date, 'DD Month YYYY', 'NLS_DATE_LANGUAGE=FRENCH') AS fr_date
FROM employees;
场景:动态SQL生成
-- SQL Server示例(根据参数动态格式化)
DECLARE @formatStyle INT = 103; -- dd/mm/yyyy
SELECT
order_id,
CONVERT(VARCHAR, order_date, @formatStyle) AS formatted_date
FROM orders;
五、避坑指南
- 时区陷阱-- PostgreSQL错误示例(忽略时区)
SELECT TO_CHAR('2023-07-05 14:30:45+00'::TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS');
-- 输出:2023-07-05 14:30:45(丢失时区信息)
-- 正确做法
SELECT TO_CHAR('2023-07-05 14:30:45+00'::TIMESTAMPTZ AT TIME ZONE 'Asia/Tokyo', 'YYYY-MM-DD HH24:MI:SS');
-- 输出:2023-07-05 23:30:45 - 性能陷阱-- MySQL错误示例(在WHERE中使用格式化)
SELECT * FROM logs
WHERE DATE_FORMAT(log_time, '%Y-%m-%d') = '2023-07-05';
-- 导致全表扫描
-- 正确做法(使用范围查询)
SELECT * FROM logs
WHERE log_time >= '2023-07-05'
AND log_time < '2023-07-06'; - 本地化陷阱-- Oracle月份填充问题
SELECT TO_CHAR(SYSDATE, 'Month') FROM dual;
-- 输出:'August '(带空格)
-- 解决方案
SELECT TRIM(TO_CHAR(SYSDATE, 'Month')) FROM dual;
-- 或
SELECT TO_CHAR(SYSDATE, 'FMMonth') FROM dual; -- FM抑制填充
六、最佳实践建议
- 存储标准化
- 始终以UTC时间存储时间戳
- 使用数据库原生时间类型(非字符串)
- 格式化分层处理graph TD
A[数据库层] -->|返回标准时间| B[应用层]
B --> C{展示需求}
C -->|简单格式化| D[前端处理]
C -->|复杂本地化| E[后端处理] - 格式复用策略-- PostgreSQL示例(创建格式化函数)
CREATE FUNCTION fmt_cn_date(TIMESTAMPTZ) RETURNS TEXT AS $
SELECT TO_CHAR($1 AT TIME ZONE 'Asia/Shanghai', 'YYYY"年"MM"月"DD"日" HH24"时"MI"分"');
$ LANGUAGE SQL IMMUTABLE;
SELECT fmt_cn_date(event_time) FROM events; - 安全注意事项-- 防止SQL注入(动态格式)
-- 错误做法
EXECUTE 'SELECT TO_CHAR(SYSDATE, ''' || user_input || ''') FROM dual';
-- 正确做法(白名单校验)
IF user_input IN ('YYYY-MM-DD', 'DD/MM/YYYY') THEN
EXECUTE '...' USING user_input;
END IF;
通过以上详细对比和示例,我们可以清晰地看到各数据库在日期转字符串功能上的异同。在实际应用中,根据数据库类型和业务需求选择合适的函数和格式,同时注意性能和国际化问题,可以高效地完成日期格式化任务。
相关推荐
- 深度剖析 MySQL 数据库索引失效场景与优化策略
-
在互联网软件开发领域,MySQL数据库凭借其开源、高效等特性被广泛应用。而索引,作为提升MySQL查询性能的关键利器,能大幅加速数据检索。然而,在实际开发中,即便精心创建了索引,却常常遭遇索引失...
- 15分钟,带你了解indexedDB,这个前端存储方案很重要!
-
原文来源于:程序员成长指北;作者:Django强哥如有侵权,联系删除最近在给前端班授课,在这次之前的最后一次课已经是在2年前,2年的时间,前端的变化很大,也是时候要更新课件了。整理客户端存储篇章时模糊...
- MySQL 面试总被问到的那些问题,你都懂了吗?
-
事务的四大特性是什么?首先得提一下ACID,这可是数据库事务的灵魂所在:原子性(Atomicity):要么全部成功,要么全部失败回滚。一致性(Consistency):确保数据在事务前后都处于一致状态...
- Java 字符串常见的操作_java字符串总结
-
在Java当中,为字符串类提供了丰富的操作方法,对于字符串,我们常见的操作就是:字符串的比较、查找、替换、拆分、截取以及其他的一些操作。在Java中,有String,StringBuffer和St...
- java学习分享:Java截取(提取)子字符串(substring())
-
在String中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。1.substring(intbeginIndex)形...
- 你必须知道的 7 个杀手级 JavaScript 单行代码
-
1.如果你需要一个临时的唯一ID,请生成随机字符串。这个例子将为你生成一个随机字符串:constrandomString=Math.random().toString(36).slice(2)...
- MySQL 索引失效:原因、场景与解决方案
-
在互联网软件开发领域,MySQL作为一款广泛使用的关系型数据库,其性能优化至关重要。而索引,作为提升MySQL查询性能的关键手段,一旦失效,会导致查询效率大幅下降,影响整个系统的性能。今天,就来...
- Axure9 教程:可模糊搜索的多选效果
-
一、交互效果说明1.点击话题列表中的话题选项,上方输入框内显示选择的话题标签,最多可选择5个标签,超出将有文字提示。2.点击输入框内已选择的话题标签的删除按钮,可以删除已选择的话题标签,并且该标签返回...
- JavaScript字符串操作方法大全,包含ES6方法
-
一、charAt()返回在指定位置的字符。...
- 为什么MySQL索引不生效?来看看这8个原因
-
在数据库优化中,最让人头疼的事情之一莫过于精心设计的索引没有发挥作用。为什么会出现这种情况?这篇文章带大家一起探讨一些常见原因,方便大家更好地理解MySQL查询优化器是如何选择索引的,以及在出现类...
- Kettle实现rabbitMQ的生产与消费_rabbitmq不支持顺序消费
-
文章目录一、Kettle为什么可以读取流数据?...
- MySQL高频函数Top10!数据分析效率翻倍,拒绝无效加班!
-
引言:为什么你的SQL代码又臭又长?“同事3行代码搞定的事,你写了30行?”“每次处理日期、字符串都抓狂,疯狂百度?”——不是你不努力,而是没掌握这些高频函数!本文精炼8年数据库开发经验,总结出10个...
- mysql的截取函数用法详解_mysql截取指定字符
-
substring()函数测试数据准备:用法:以下语法是mysql自动提示的1:substirng(str,pos):从指定位置开始截取一直到数据完成str:需要截取的字段的pos:开始截取的位置。从...
- MySQL函数:字符串如何截取_mysql 字符串截取函数
-
练习截取字符串函数(五个)mysql索引从1开始...
- 数据集成产品分析(一)_数据集成工具有哪些
-
编辑导语:数据集成产品是数据中台建设的第一环节,在构建数据中台或大数据系统时,首先要将企业内部各个业务系统的数据实现互联互通,从物理上打破数据孤岛。本文作者对数据集成产品进行了分析,一起来看一下吧。数...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
如何将AI助手接入微信(打开ai手机助手)
-
SparkSQL——DataFrame的创建与使用
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
redission YYDS spring boot redission 使用
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)