百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

主流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;

五、避坑指南

  1. 时区陷阱-- 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
  2. 性能陷阱-- 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';
  3. 本地化陷阱-- 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抑制填充

六、最佳实践建议

  1. 存储标准化
  2. 始终以UTC时间存储时间戳
  3. 使用数据库原生时间类型(非字符串)
  4. 格式化分层处理graph TD
    A[数据库层] -->|返回标准时间| B[应用层]
    B --> C{展示需求}
    C -->|简单格式化| D[前端处理]
    C -->|复杂本地化| E[后端处理]
  5. 格式复用策略-- 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;
  6. 安全注意事项-- 防止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开始...

数据集成产品分析(一)_数据集成工具有哪些

编辑导语:数据集成产品是数据中台建设的第一环节,在构建数据中台或大数据系统时,首先要将企业内部各个业务系统的数据实现互联互通,从物理上打破数据孤岛。本文作者对数据集成产品进行了分析,一起来看一下吧。数...