mysql中日期与时间函数的应用与格式化

发布时间 - 2026-02-02 00:00:00    点击率:
应使用 FROM_UNIXTIME() 将时间戳转为可读日期,如 FROM_UNIXTIME(1717023600) 返回 '2025-05-30 15:00:00',支持自定义格式;STR_TO_DATE() 仅适用于字符串转日期,不接受整数时间戳。

MySQL 里怎么把时间戳转成可读日期?用 FROM_UNIXTIME() 而不是 STR_TO_DATE()

很多新手看到时间戳(比如 1717023600)第一反应是用 STR_TO_DATE(),但这个函数只处理字符串,不认整数时间戳。真正该用的是 FROM_UNIXTIME()

  • FROM_UNIXTIME(1717023600)'2025-05-30 15:00:00'(默认格式)
  • 加第二个参数可自定义格式:FROM_UNIXTIME(1717023600, '%Y年%m月%d日 %H点%i')'2025年05月30日 15点00'
  • 注意:如果字段是 BIGINT 类型存的 Unix 时间戳,直接传入即可;如果是字符串(如 '1717023600'),MySQL 会自动隐式转换,但不建议依赖这点
  • 时区影响大:该函数按 MySQL 当前会话时区输出,SELECT @@time_zone 查看当前设置,必要时先执行 SET time_zone = '+8:00'

想从日期字段里单独取年份或小时?别用字符串截取,用 YEAR()HOUR() 等专用函数

有人用 SUBSTR(created_at, 1, 4) 提年份,看似能用,但一遇到 DATEDATETIME 字段类型就出错——SUBSTR 是字符串函数,对日期类型会触发隐式转换,结果不可靠且慢。

  • 正确做法:YEAR(created_at)MONTH(created_at)DAY(created_at)HOUR(updated_at)MINUTE(updated_at)
  • 这些函数返回整数,可用于 GROUP BY 或条件筛选,比如:
    SELECT YEAR(order_time) AS y, COUNT(*) FROM orders GROUP BY y;
  • WEEKDAY()DAYOFWEEK() 返回值不同:前者周一是 0,后者周日是 1,写报表时容易搞反,建议注释说明
  • NULL 值安全:所有这类函数遇到 NULL 都返回 NULL,不会报错,但要注意后续逻辑是否容错

DATE_FORMAT() 格式化输出时,为什么有些格式符不生效?检查字段类型和 SQL 模式

DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') 没问题,但换成 DATE_FORMAT('2025-05-30', '%W %M %e, %Y') 却返回 NULL,常见原因是输入不是合法日期类型。

  • 输入必须是 DATEDATETIME 或能被 MySQL 自动识别为日期的字符串(如 '2025-05-30'),像 '30/05/2025' 这种格式会失败
  • 如果字段是 VARCHAR 存的日期,先用 STR_TO_DATE(col, '%d/%m/%Y') 转成日期,再套 DATE_FORMAT()
  • 严格模式下(sql_modeSTRICT_TRANS_TABLES),非法日期如 '2025-02-30' 会导致整个表达式为 NULL,而不是静默转成 '2025-03-01'
  • 中文星期/月份需要系统字符集支持:确保客户端连接字符集是 utf8mb4,且 MySQL 的 lc_time_names 设为 'zh_CN',否则 %W 显示英文

计算两个时间差用 TIMESTAMPDIFF(),别手算秒数除法

(UNIX_TIMESTAMP(end) - UNIX_TIMESTAMP(start)) / 3600 算小时数,看着简单,但跨夏令时、闰秒、时区切换时结果错得离谱。

  • TIMESTAMPDIFF(HOUR, start_time, end_time) 自动处理时区和日历逻辑,推荐用于业务统计
  • 单位支持:SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
  • 注意顺序:TIMESTAMPDIFF 是「后减前」,即 TIMESTAMPDIFF(DAY, '2025-01-01', '2025-01-05') 返回 4,不是 5
  • 性能友好:比嵌套 UNIX_TIMESTAMP() 快,尤其在大表 WHERE 条件中使用时,能走索引(如果字段有索引)

MySQL 的日期函数看着简单,实际踩坑多在类型隐式转换、时区配置、SQL 模式和输入格式这四点上。写完记得用真实数据测一遍 NULL、边界日期

(如 2025-02-29)、不同时区客户端,不然上线后才发现显示乱码或统计偏差,就得翻日志查半天。


# mysql  # unix  # 格式化输出  # 隐式转换  # 为什么  # sql  # NULL  # select  # date  # 字符串  # 严格模式  # 看着  # 转成  # 自定义  # 隐式  # 的是  # 客户端  # 而不是  # 一是  # 且慢  # 设为 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现数据库事务?(DB Facade示例)  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  音乐网站服务器如何优化API响应速度?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  如何在IIS7上新建站点并设置安全权限?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何在自有机房高效搭建专业网站?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  文字头像制作网站推荐软件,醒图能自动配文字吗?  使用Dockerfile构建java web环境  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  高防服务器租用首荐平台,企业级优惠套餐快速部署  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何快速上传建站程序避免常见错误?  Laravel如何自定义分页视图?(Pagination示例)  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  想要更高端的建设网站,这些原则一定要坚持!  Swift开发中switch语句值绑定模式  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何实现javascript表单验证_正则表达式有哪些实用技巧  js实现点击每个li节点,都弹出其文本值及修改  详解jQuery停止动画——stop()方法的使用  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何快速重置建站主机并恢复默认配置?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  java获取注册ip实例  如何在万网开始建站?分步指南解析  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  SQL查询语句优化的实用方法总结  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  利用vue写todolist单页应用  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  创业网站制作流程,创业网站可靠吗?  昵图网官网入口 昵图网素材平台官方入口  Java垃圾回收器的方法和原理总结  微信小程序 wx.uploadFile无法上传解决办法  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  如何快速完成中国万网建站详细流程?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  JavaScript如何实现类型判断_typeof和instanceof有什么区别  网站制作企业,网站的banner和导航栏是指什么?  如何用wdcp快速搭建高效网站?  Laravel如何处理异常和错误?(Handler示例)  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel怎么为数据库表字段添加索引以优化查询  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧