SQL Server 和 MySQL 中的 Date 函数(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据库开发中,日期和时间的处理是高频需求场景。无论是计算用户注册时长、统计销售周期,还是生成时间序列报告,开发者都需要熟练掌握 SQL Server
和 MySQL
中的 Date 函数。然而,这两个数据库在日期函数的设计和语法上存在显著差异,这可能让初学者感到困惑。本文将以 SQL Server 和 MySQL 中的 Date 函数为核心,通过对比、案例和比喻,帮助读者系统化理解两者的核心功能,并提升实际开发中的代码兼容性。
日期与时间的基础概念
日期和时间在数据库中通常以 DATE
、DATETIME
或 TIMESTAMP
类型存储,但两者的具体行为和存储精度不同。例如:
- SQL Server 的
DATETIME
精度为 3.33 毫秒,而DATE
类型仅存储日期部分; - MySQL 的
DATETIME
精度为秒级,而TIMESTAMP
则与系统时区绑定,存储范围有限。
理解这些差异是使用日期函数的前提。想象日期类型像“时间容器”,不同的容器设计决定了你能“装入”或“取出”的时间颗粒度。
SQL Server 中的常用 Date 函数
1. 基础日期提取函数
SQL Server 提供了 YEAR()
, MONTH()
, DAY()
等函数,用于从日期中提取特定部分。例如:
SELECT
YEAR(GETDATE()) AS Current_Year,
MONTH('2023-05-20') AS Month_Number,
DAY('2023-05-20') AS Day_Number;
输出结果:
| Current_Year | Month_Number | Day_Number |
|--------------|--------------|------------|
| 2024 | 5 | 20 |
比喻:这些函数如同“时间拆解器”,将日期“切割”成年、月、日等独立部件。
2. 日期计算与偏移
DATEADD()
函数允许对日期进行加减操作。例如:
SELECT
DATEADD(DAY, 7, '2023-01-01') AS Next_Week,
DATEADD(YEAR, -1, GETDATE()) AS Last_Year_Today;
参数说明:
- 第一个参数是时间单位(如
DAY
,MONTH
,YEAR
),第二个是偏移量,第三个是原始日期。
3. 获取当前时间
GETDATE()
返回当前日期和时间,类似“时间快照”:
SELECT GETDATE() AS Current_Datetime;
4. 日期格式化
FORMAT()
函数支持自定义输出格式:
SELECT
FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss') AS Formatted_Date;
MySQL 中的常用 Date 函数
1. 基础日期提取函数
MySQL 提供 YEAR()
, MONTH()
, DAY()
等函数,用法与 SQL Server 类似:
SELECT
YEAR(NOW()) AS Current_Year,
MONTH('2023-05-20') AS Month_Number,
DAY('2023-05-20') AS Day_Number;
2. 日期计算与偏移
DATE_ADD()
函数需配合 INTERVAL
关键字使用,语法稍显复杂:
SELECT
DATE_ADD('2023-01-01', INTERVAL 7 DAY) AS Next_Week,
DATE_SUB(NOW(), INTERVAL 1 YEAR) AS Last_Year_Today;
参数说明:
- 时间单位(如
DAY
,MONTH
,YEAR
)需紧跟INTERVAL
,且函数名称为DATE_ADD
或DATE_SUB
。
3. 获取当前时间
NOW()
或 CURRENT_TIMESTAMP
返回当前日期和时间:
SELECT NOW() AS Current_Datetime;
4. 日期格式化
DATE_FORMAT()
函数通过占位符定义格式:
SELECT
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS Formatted_Date;
关键差异与兼容性注意事项
1. 日期计算函数的语法差异
- SQL Server:
DATEADD(unit, number, date)
- MySQL:
DATE_ADD(date, INTERVAL number unit)
例如,将日期向后推 3 天:
- SQL Server:
DATEADD(DAY, 3, '2023-01-01')
- MySQL:
DATE_ADD('2023-01-01', INTERVAL 3 DAY)
2. 格式化函数的占位符规则
- SQL Server 的
FORMAT()
使用yyyy
表示年份,MM
表示月份; - MySQL 的
DATE_FORMAT()
使用%Y
表示年份,%m
表示月份。
3. 日期差函数的参数顺序
- SQL Server:
DATEDIFF(unit, start_date, end_date)
- MySQL:
DATEDIFF(end_date, start_date)
(仅支持天为单位)
示例:计算两个日期之间的天数差:
-- SQL Server
SELECT DATEDIFF(DAY, '2023-01-01', '2023-01-10') AS Days_Between;
-- MySQL
SELECT DATEDIFF('2023-01-10', '2023-01-01') AS Days_Between;
4. 时区处理
- MySQL 支持
CONVERT_TZ()
函数进行时区转换; - SQL Server 需依赖系统时区设置,或通过扩展函数实现。
实战案例:跨数据库的日期操作
案例 1:计算用户年龄
假设需从出生日期计算年龄,两种数据库的写法对比:
SQL Server:
SELECT
DATEDIFF(YEAR, Birthdate, GETDATE()) -
CASE WHEN MONTH(Birthdate) > MONTH(GETDATE()) OR
(MONTH(Birthdate) = MONTH(GETDATE()) AND DAY(Birthdate) > DAY(GETDATE()))
THEN 1 ELSE 0 END AS Age;
MySQL:
SELECT
TIMESTAMPDIFF(YEAR, Birthdate, CURDATE()) AS Age;
解析:
- SQL Server 需手动处理“是否已过生日”逻辑;
- MySQL 的
TIMESTAMPDIFF()
自动完成年份差计算。
案例 2:生成月份统计报告
假设需按月统计订单量,两种数据库的实现:
SQL Server:
SELECT
FORMAT(OrderDate, 'yyyy-MM') AS Month,
COUNT(*) AS Order_Count
FROM Orders
GROUP BY FORMAT(OrderDate, 'yyyy-MM')
ORDER BY Month;
MySQL:
SELECT
DATE_FORMAT(OrderDate, '%Y-%m') AS Month,
COUNT(*) AS Order_Count
FROM Orders
GROUP BY Month
ORDER BY Month;
结论
掌握 SQL Server 和 MySQL 中的 Date 函数,是提升数据库开发效率的关键。本文通过对比核心函数、差异分析和实战案例,帮助读者理解两者的异同,并选择适合的实现方式。对于初学者,建议从基础函数开始练习,逐步构建“日期工具箱”;中级开发者则需关注跨数据库兼容性,避免因语法差异导致的逻辑错误。
时间管理如同编程,精准的函数选择和逻辑设计,将让开发过程更高效、更优雅。希望本文能成为您探索日期函数世界的指南针!