MySQL 时间日期函数

时间日期类型

MySQL中主要支持以下几种时间日期类型:

  1. DATE - 日期类型

    • 格式:'YYYY-MM-DD'
    • 范围:'1000-01-01' 到 '9999-12-31'
    • 示例:'2023-05-20'
  2. TIME - 时间类型

    • 格式:'HH:MM:SS'
    • 范围:'-838:59:59' 到 '838:59:59'
    • 示例:'15:30:00' 或 '02:45:30.123456'(支持微秒)
  3. DATETIME - 日期时间类型

    • 格式:'YYYY-MM-DD HH:MM:SS'
    • 范围:'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'
    • 存储方式​:按字面值存储,不进行时区转换
    • 示例:'2023-05-20 15:30:00'
    • 适合存储固定时间点(如生日、历史事件)
    • 不自动更新
    • 占用 ​8 字节​ 存储空间
  4. TIMESTAMP - 时间戳类型

    • 格式:'YYYY-MM-DD HH:MM:SS'
    • 范围:1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC(受 32 位限制)
    • 存储方式​:转换为 UTC 存储,检索时转回当前时区
    • 适合记录数据变更时间(如 created_atupdated_at
    • 可自动初始化/更新(配合 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP
    • 占用 ​4 字节​ 存储空间
    • 受时区影响(存储和检索时会根据服务器时区转换)
  5. YEAR - 年份类型

    • 格式:YYYY
    • 范围:1901 到 2155
    • 示例:'2023'

DATETIME VS TIMESTAMP

特性DATETIMETIMESTAMP
范围1000-9999 年1970-2038 年(UTC)
时区处理按字面值存储存储时转 UTC,检索时转回本地时区
自动更新不支持支持(需显式定义)
存储空间8 字节4 字节
典型用途固定时间(如生日)记录时间(如日志、更新时间戳)

使用建议

  • 需要记录 ​事件发生的具体时间​(如订单时间)且不关心时区 → ​DATETIME
  • 需要 ​自动记录数据插入/更新时间​ 或处理时区敏感数据 → ​TIMESTAMP
  • 注意 TIMESTAMP 的 ​2038 年问题​(未来 MySQL 可能扩展为 64 位)

日期增减

日期加:DATE_ADD

基本语法

DATE_ADD(date, INTERVAL expr unit)

功能
在指定日期/时间上添加一个时间间隔

参数说明

  • date:要处理的日期/时间值(可以是DATE, DATETIME或TIMESTAMP类型)
  • expr:要添加的间隔数值(可以是正数或负数)
  • unit:时间单位(见下方支持的单位)

支持的时间单位

MICROSECOND | SECOND | MINUTE | HOUR | DAY 
| WEEK | MONTH | QUARTER | YEAR 
| SECOND_MICROSECOND | MINUTE_MICROSECOND 
| MINUTE_SECOND | HOUR_MICROSECOND 
| HOUR_SECOND | HOUR_MINUTE 
| DAY_MICROSECOND | DAY_SECOND 
| DAY_MINUTE | DAY_HOUR 
| YEAR_MONTH

使用示例

-- 加1天
SELECT DATE_ADD('2023-01-01', INTERVAL 1 DAY);  
-- 结果: 2023-01-02-- 加1个月
SELECT DATE_ADD('2023-01-31', INTERVAL 1 MONTH); 
-- 结果: 2023-02-28 (自动处理月末)-- 加1年
SELECT DATE_ADD('2020-02-29', INTERVAL 1 YEAR);  
-- 结果: 2021-02-28 (闰年自动调整)-- 加3小时30分钟
SELECT DATE_ADD('2023-01-01 12:00:00', INTERVAL '3:30' HOUR_MINUTE); 
-- 结果: 2023-01-01 15:30:00-- 使用负数表示减法
SELECT DATE_ADD('2023-01-01', INTERVAL -1 DAY);  
-- 结果: 2022-12-31

日期减:DATE_SUB

基本语法

DATE_SUB(date, INTERVAL expr unit)

功能
与DATE_ADD相反,从指定日期/时间减去一个时间间隔

使用示例

-- 减1天
SELECT DATE_SUB('2023-01-01', INTERVAL 1 DAY);  
-- 结果: 2022-12-31-- 减1个月
SELECT DATE_SUB('2023-03-31', INTERVAL 1 MONTH); 
-- 结果: 2023-02-28-- 等同于DATE_ADD使用负数
SELECT DATE_SUB('2023-01-01', INTERVAL 1 DAY) = DATE_ADD('2023-01-01', INTERVAL -1 DAY); 
-- 结果: 1(TRUE)

简写语法

MySQL还提供更简洁的日期加减写法:

-- 加1天
SELECT '2023-01-01' + INTERVAL 1 DAY;-- 减1个月
SELECT '2023-01-01' - INTERVAL 1 MONTH;

实际应用场景

场景1:计算到期日

-- 贷款30天后到期
SELECT loan_date, DATE_ADD(loan_date, INTERVAL 30 DAY) AS due_date 
FROM loans;

场景2:查找最近7天的记录

SELECT * FROM orders 
WHERE order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY);

场景3:处理订阅续期

-- 订阅续期1年
UPDATE subscriptions 
SET end_date = DATE_ADD(end_date, INTERVAL 1 YEAR)
WHERE user_id = 1001;

注意事项

  1. 自动调整无效日期

    SELECT DATE_ADD('2023-01-31', INTERVAL 1 MONTH); -- 返回2023-02-28
    
  2. 闰年处理

    SELECT DATE_ADD('2020-02-29', INTERVAL 1 YEAR); -- 返回2021-02-28
    
  3. 时间溢出处理

    SELECT DATE_ADD('2023-01-01 23:59:59', INTERVAL 1 SECOND); -- 返回2023-01-02 00:00:00
    
  4. 性能考虑:在WHERE条件中对列使用这些函数会导致索引失效

与其他日期函数的对比

需求推荐函数示例
计算未来/过去特定时间点DATE_ADD/DATE_SUBDATE_ADD(now(), INTERVAL 1 HOUR)
计算两个日期的差值DATEDIFF/TIMESTAMPDIFFDATEDIFF(end_date, start_date)
提取日期部分DATE_FORMAT/EXTRACTEXTRACT(YEAR FROM date)
获取当前日期/时间NOW/CURDATESELECT CURDATE(), NOW()

时间/日期差

时间差:TIMESTAMPDIFF

TIMESTAMPDIFF 是 MySQL/MariaDB 中用于计算两个时间戳之间差异的函数

基本语法

TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
  • unit: 时间单位(YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND 等)
  • datetime_expr1: 起始时间
  • datetime_expr2: 结束时间

时间单位选项

单位说明
MICROSECOND微秒
SECOND
MINUTE分钟
HOUR小时
DAY
WEEK
MONTH
QUARTER季度
YEAR

使用示例

  1. 计算小时差

    SELECT TIMESTAMPDIFF(HOUR, '2022-03-22 08:00:00', '2022-03-22 17:30:00');
    -- 返回 9(只计算完整的小时数,忽略分钟部分)
    
  2. 计算天数差

    SELECT TIMESTAMPDIFF(DAY, '2022-03-01', '2022-03-15');
    -- 返回 14
    
  3. 计算月数差

    SELECT TIMESTAMPDIFF(MONTH, '2022-01-15', '2022-05-20');
    -- 返回 4(不考虑具体的天数)
    

重要特性

  1. 返回值总是整数:函数返回的是两个时间之间的完整单位数不包含小数部分

  2. 参数顺序敏感datetime_expr2 减去 datetime_expr1,如果 datetime_expr1 更大,结果为负数

  3. 自动处理日期格式:函数会自动识别标准日期时间格式

  4. 跨年/月计算:能正确处理跨年、跨月的时间差计算

高级用法

  1. 计算年龄

    SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM users;
    
  2. 计算服务时长(精确到月)

    SELECT employee_name,TIMESTAMPDIFF(MONTH, hire_date, CURDATE()) AS months_of_service
    FROM employees;
    
  3. 组合使用

    SELECT CONCAT(TIMESTAMPDIFF(YEAR, '2000-01-01', '2023-05-15'), '年',TIMESTAMPDIFF(MONTH, '2000-01-01', '2023-05-15') % 12, '个月') AS time_diff;
    

注意事项

  1. 对于 MONTH 和 YEAR 单位,函数只比较月份和年份部分,不考虑具体的天数

  2. 如果需要更精确的时间差(包含小数),可以考虑使用 TIMESTAMPDIFF 结合其他函数,或者使用 UNIX_TIMESTAMP 计算秒数差再转换

  3. 在旧版 MySQL 中可能不支持某些时间单位(如 MICROSECOND)

案例
统计各岗位员工平均工作时长

时间差:UNIX_TIMESTAMP 

UNIX_TIMESTAMP 是 SQL 中常用的时间函数,主要用于获取或转换 Unix 时间戳(从1970年1月1日00:00:00 UTC到当前时间的秒数)。

计算时间差

SELECT (UNIX_TIMESTAMP('2022-03-22 17:00:00') - 
UNIX_TIMESTAMP('2022-03-22 08:00:00')) / 3600 
AS hours_diff;

返回当前时间的Unix时间戳

SELECT UNIX_TIMESTAMP();  

日期时间→时间戳

SELECT UNIX_TIMESTAMP('2023-10-01 12:00:00');

时间戳→日期时间

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());  

日期差:DATEDIFF

DATEDIFF()是MySQL中用于计算两个日期之间天数差的函数。

DATEDIFF(date1, date2)
  • date1 和 date2 是日期或日期时间表达式
  • 函数返回 date1 减去 date2 的天数差

示例

计算两个日期之间的天数差

SELECT DATEDIFF('2023-12-31', '2023-01-01');  -- 返回 364

计算当前日期与特定日期的天数差

SELECT DATEDIFF(CURDATE(), '2023-01-01');

在表查询中使用

SELECT order_id, 
DATEDIFF(shipped_date, order_date) AS processing_days
FROM orders;

注意事项

  • 时间部分会被忽略,只计算日期部分
  • 如果date1早于date2,结果为负数
  • 参数可以是DATE、DATETIME或TIMESTAMP类型
  • 如果任一参数为NULL,结果也为NULL
  • TIMESTAMPDIFF()可以计算更精确的时间差(年、月、日、小时等),DATEDIFF()只返回天数差

日期格式化

DATE_FORMAT

在 MySQL 中,DATE_FORMAT() 函数用于将日期或时间值格式化为指定的字符串格式

正确语法

DATE_FORMAT(date, format)

常用格式说明符

说明符描述
%Y四位数的年份(例如:2023)
%y两位数的年份(例如:23)
%m两位数的月份(01-12)
%d两位数的日期(01-31)
%H24小时制的小时(00-23)
%i分钟(00-59)
%s秒(00-59)

示例用法

  1. 获取四位数的年份:
SELECT DATE_FORMAT(created_at, '%Y') FROM your_table;
  1. 获取完整的日期时间格式:
SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') FROM your_table;
  1. 获取月份和年份:
SELECT DATE_FORMAT(created_at, '%M %Y') FROM your_table;
-- 结果示例:"May 2023"
  1. 在你的例子中,如果要提取年份:
SELECT DATE_FORMAT(created_at, '%Y') AS year FROM your_table;

注意事项

  • MySQL 的 DATE_FORMAT() 函数使用百分号 (%) 作为格式说明符的前缀
  • 函数名是 DATE_FORMAT 而不是 dateformt(注意大小写不敏感但拼写要正确)
  • 第一个参数是日期/时间列或表达式,第二个参数是格式字符串

day()、month()、year()

selectdate_format (date, "%d") as day,count(*) as question_cnt
fromquestion_practice_detail
wheredate_format (date, "%m") = 8and date_format (date, "%y") = 21
group by day

用day、month、year简化

selectday (date) as day,count(*) as question_cnt
fromquestion_practice_detail
wheremonth (date) = 8and year (date) = 2021
group byday

(1)like语法:date like “2021-08%”
(2)year、month函数:year(date)=‘2021’ and month(date)=‘08’;
(3)date_format函数:date_format(date, ‘%Y-%m’)=‘2021-08’;

其他函数

last_day()

last_day()返回参数日期的最后一天

SELECT*,LAST_DAY( end_date ) as `LAST_DAY`
FROMjob_history;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87687.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

408第三季part2 - 计算机网络 - 物理层

理解 这里有8个波形,每个波形代表一个马原,一个马原代表多个比特,这里3个比特 求波特率就直接2W 求比特率就要乘log2V 这块记两公式就行,一个下面一个上面 题目 4个相位加4种幅度就是有16种波形 这里无噪声就是奈奎斯特定理 这…

iOS 集成RN Installing glog (0.3.5)报错的解决方案

在集成执行RN bundle exec pod install 命令到Installing glog (0.3.5)时报错,报错信息如下: Installing glog (0.3.5) [!] /bin/bash -c set -e #!/bin/bash # Copyright (c) Facebook, Inc. and its affiliates. # # This source code is licensed under the MIT license …

【进阶篇-消息队列】——MQTT协议如何支持海量的在线IoT设备

目录 一、什么是IoT二、MQTT 和其他消息队列的传输协议有什么不同三、如何选择 MQTT 产品四、MQTT 集群如何支持海量在线的 IoT 设备五、总结本文来源:极客时间vip课程笔记 一、什么是IoT IoT,也就是物联网,物联网这个词儿,它的含义还不那么直观,但你看它的英文:IoT,也就…

Chat Model API

聊天模型API为开发人员提供了将人工智能聊天完成功能集成到应用程序中的能力。它利用预训练的语言模型,如GPT(生成预训练转换器),以自然语言对用户输入生成类似人类的响应。 API通常通过向人工智能模型发送提示或部分对话来工作&…

【黑群晖】自组硬件/旧电脑nas改造(三)——使用Jellyfin创建家庭影音库

一、打开套件中心安装Jellyfin套件 如果找不到Jellyfin套件,需要手动添加三方套件源: 《群晖NAS必学技能:一键解锁三方套件源,PT下载影音播放全搞定!》 二、配置Jellyfin 访问http://群晖IP:8096 进入Jellyfin初始化界…

泰山派编译debian报错 lb config: unrecognized option ‘--debootstrap-options‘

简介 最近在编译泰山派 编译buildroot系统正常,但是编译debian时总是报错说lb 找不到一些参数,如下图所示,应该当前的版本较低 不支持这些参数,我试了很多方法 升级次版本 但是提示的是最新的,最后经过一番搜索 在官方…

跨境证券交易系统合规升级白皮书:全链路微秒风控+开源替代,护航7月程序化交易新规落地

1 行业变革:四重驱动力重塑证券交易系统 当前全球证券行业正处于深刻变革期,跨境金融活动面临前所未有的机遇与挑战。今日央行开展的1310亿元7天期逆回购操作,以及国家外汇管理局向合格境内机构投资者(QDII)新增发放30.8亿美元投资额度等政策…

Node.js核心API(fs篇)

前言:在Node.js生态系统中,文件系统操作是后端开发不可或缺的一部分。fs模块作为Node.js核心API的重要组成部分,提供了与文件系统交互的能力,涵盖了从基础的文件读写到复杂的目录操作等功能。现代JavaScript开发中,处理…

HarmonyOS学习2---Stage模型

1、工程目录结构 1.1、入口 UIAbility 1.2、入口page 1.3、配置文件 1、配置文件 1)应用级配置文件 --- app.json5 2)模块级配置文件 --- module.json5 3、oh-package.json5 4、资源文件 1)element目录 2)media目录 3&#xff09…

【软件工程】软件复刻项目的完整流程指南

软件复刻项目的完整流程指南 第一章、概述 一、前期准备:明确目标与合规性 1. 法律风险评估 版权排查:确认目标软件的 UI 设计、代码、商标是否受保护(如界面元素、核心算法是否申请专利)。规避侵权:避免直接复制 …

浅谈Python 中的当前工作目录与脚本目录

Python 中的 os.path.exists() 和 __file__ 使用陷阱:工作目录 ≠ 脚本目录 在使用 os.path.exists() 或 open() 等函数操作文件路径时,笔者常常忽略一个关键概念:当前运行目录(Current Working Directory, CWD)并不等…

iOS检测并阻止骚扰电话的方法

检测并阻止骚扰电话 你可以在 iPhone 上使用“将未知来电者设置为静音”或第三方 App 来阻止骚扰电话。 打开“将未知来电者设置为静音” 在 iOS 13 及更高版本中,你可以打开“静音未知来电”,以免接到陌生人的来电。这一功能可以阻止那些你从未联系过…

TensorFlow源码深度阅读指南

TensorFlow源码深度阅读指南 本文基于《TensorFlow内核剖析》附录A的代码阅读方法论,结合实例解析核心源码阅读技巧(含关键图示):一、源码阅读的四个维度 1. 分层切入策略(图A-1) #mermaid-svg-ooLMzaWU5ky…

设计模式-责任链模式、策略模式

责任链模式 Chain of Responsibility(职责链)—对象行为型模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象…

泛微e-cology remarkOperate远程命令执行漏洞

【高危】泛微e-cology remarkOperate远程命令执行漏洞 漏洞描述 泛微e-cology是泛微公司开发的协同管理应用平台。 受影响版本中,接口 /api/workflow/reqform/remarkOperate 存在 SQL 注入漏洞,multipart 类型参数 requestid 直接拼接进 SQL 语句&…

Redis常用操作

1:redis常用操作: package com.shunaier.hhhh.biz.utils;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.shunaier.hhhh.common.enums.SystemErrorEnum; import com.shunaier.hhhh.common.exception.SNEB…

mybatis-plus-01-环境初始化及简单应用

文章目录 【README】【1】springboot集成mybatis-plus配置【1.1】目录结构【相关说明】 【1.2】代码示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表语句】 【2】演示 【README】 本文代码参见&…

VR小鼠解剖虚拟仿真:开启生命科学教育新视野​

VR 小鼠解剖虚拟仿真,是一项将虚拟现实(VR)技术深度融入小鼠解剖学习与研究过程的创新应用,即 VR 小鼠解剖虚拟仿真。其核心原理在于,借助 VR 技术所构建的高度逼真的虚拟环境,突破了传统小鼠解剖在时间、空间以及实体操作上的诸多…

计算机网络(网页显示过程,TCP三次握手,HTTP1.0,1.1,2.0,3.0,JWT cookie)

前言 最近一直在后端开发的面经🙌,里面涉及到了好多计算机网络的知识😁,在这里以问题的形式写一个学习笔记(其中参考了: JavaGuide 和 小林coding 这两个很好的学习网站😘) 1.当键入网址后&am…

Redis 消息的发布和订阅

Redis 消息的发布和订阅 1、什么是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 2、Redis的发布和订阅示意 1、客户端可以订阅频道如下图 2、当…