SQL Server 和 MySQL 中的 Date 函数(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据库开发中,日期和时间的处理是高频需求场景。无论是计算用户注册时长、统计销售周期,还是生成时间序列报告,开发者都需要熟练掌握 SQL ServerMySQL 中的 Date 函数。然而,这两个数据库在日期函数的设计和语法上存在显著差异,这可能让初学者感到困惑。本文将以 SQL Server 和 MySQL 中的 Date 函数为核心,通过对比、案例和比喻,帮助读者系统化理解两者的核心功能,并提升实际开发中的代码兼容性。


日期与时间的基础概念

日期和时间在数据库中通常以 DATEDATETIMETIMESTAMP 类型存储,但两者的具体行为和存储精度不同。例如:

  • SQL ServerDATETIME 精度为 3.33 毫秒,而 DATE 类型仅存储日期部分;
  • MySQLDATETIME 精度为秒级,而 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_ADDDATE_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 ServerDATEADD(unit, number, date)
  • MySQLDATE_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 ServerFORMAT() 使用 yyyy 表示年份,MM 表示月份;
  • MySQLDATE_FORMAT() 使用 %Y 表示年份,%m 表示月份。

3. 日期差函数的参数顺序

  • SQL ServerDATEDIFF(unit, start_date, end_date)
  • MySQLDATEDIFF(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 函数,是提升数据库开发效率的关键。本文通过对比核心函数、差异分析和实战案例,帮助读者理解两者的异同,并选择适合的实现方式。对于初学者,建议从基础函数开始练习,逐步构建“日期工具箱”;中级开发者则需关注跨数据库兼容性,避免因语法差异导致的逻辑错误。

时间管理如同编程,精准的函数选择和逻辑设计,将让开发过程更高效、更优雅。希望本文能成为您探索日期函数世界的指南针!

最新发布