MySQL 日期函数语法介绍和案例示范以及常见问题解决

ops/2024/9/19 19:31:57/ 标签: mysql, 数据库, 面试, 系统架构

本文将以电商交易系统为例,详细讲解 MySQL 日期类型及其转化,常用的日期函数,以及一些解决常见问题的方案。

一、MySQL 日期数据类型

MySQL 提供了多种日期数据类型,适用于不同的使用场景。常见的日期类型包括 DATEDATETIMETIMESTAMPTIMEYEAR

  1. DATE:只存储日期,不包含时间部分,格式为 'YYYY-MM-DD'。例如,订单生成日期或用户注册日期。
  2. DATETIME:包含日期和时间,格式为 'YYYY-MM-DD HH:MM:SS',常用于存储订单创建时间、支付时间等。
  3. TIMESTAMP:与 DATETIME 类似,但它是一个 Unix 时间戳,通常用于记录系统事件时间。TIMESTAMP 会根据服务器时区进行自动转换。
  4. TIME:只存储时间,不包含日期部分,格式为 'HH:MM:SS'。常用于存储交易发生时的具体时间。
  5. YEAR:只存储年份,格式为 'YYYY',适合需要记录年份的场景,如产品上线年份。

使用案例:订单系统中的日期字段设计

在电商交易系统中,订单表 orders 可能包含以下与日期相关的字段:

CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE, -- 订单日期created_at DATETIME, -- 订单创建时间updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 订单最后更新时间shipped_at TIME, -- 发货时间delivery_year YEAR -- 预计送达年份
);

二、MySQL 日期类型转换

在电商系统中,日期的存储和查询常常需要进行不同类型之间的转换。以下是常见的几种日期、时间戳、字符串之间的转换方式。

1. 日期和字符串之间的转换

在 MySQL 中,可以使用 STR_TO_DATE() 函数将字符串转换为日期类型,用 DATE_FORMAT() 函数将日期转换为字符串。

  • 字符串转换为日期
SELECT STR_TO_DATE('2023-08-30', '%Y-%m-%d') AS order_date;
  • 日期转换为字符串
SELECT DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date FROM orders;

常见格式化代码如下:

  • %Y:四位数的年份(如 2023)。
  • %m:两位数的月份(如 08)。
  • %d:两位数的日期(如 30)。
  • %H:两位数的小时(24 小时制)。
  • %i:两位数的分钟。
  • %s:两位数的秒。

2. 日期和时间戳之间的转换

UNIX_TIMESTAMP() 函数可以将 DATETIME 类型的日期转换为 Unix 时间戳,而 FROM_UNIXTIME() 函数则将时间戳转换为日期。

  • 日期转换为时间戳
SELECT UNIX_TIMESTAMP(NOW()) AS current_timestamp;
  • 时间戳转换为日期
SELECT FROM_UNIXTIME(1693507200) AS order_time;

3. 字符串和时间戳之间的转换

可以先将字符串转换为日期,再通过 UNIX_TIMESTAMP() 将其转为时间戳。

  • 字符串转换为时间戳
SELECT UNIX_TIMESTAMP(STR_TO_DATE('2023-08-30 10:30:00', '%Y-%m-%d %H:%i:%s')) AS order_timestamp;

三、常用日期操作函数

在电商系统中,常常需要根据不同的业务场景进行日期的运算,例如获取前一天的订单,查询某个月的订单等。以下是一些常用的日期操作函数。

1. 获取前一天的日期

可以使用 DATE_SUB() 函数来获取前一天的日期。例如,获取前一天的所有订单:

SELECT * FROM orders WHERE order_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY);

2. 获取月底最后一天

使用 LAST_DAY() 函数可以很方便地获取某个月的最后一天。例如,查询当前月份的最后一天:

SELECT LAST_DAY(CURDATE()) AS last_day_of_month;

3. 获取每月1号

通过 DATE_FORMAT() 函数可以提取当前月份的第一天:

SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01') AS first_day_of_month;

4. 获取当前季度

使用 QUARTER() 函数可以方便地获取某个日期属于哪个季度。例如,查询当前季度:

SELECT QUARTER(CURDATE()) AS current_quarter;

5. 获取某季度的第一天和最后一天

MySQL 并没有直接提供获取季度开始和结束日期的函数,但可以通过自定义查询实现。例如,获取当前季度的第一天和最后一天:

SELECT MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())*3-3 MONTH AS first_day_of_quarter,MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())*3 MONTH - INTERVAL 1 DAY AS last_day_of_quarter;

6. 获取当前时间加减操作

可以使用 DATE_ADD()DATE_SUB() 函数来进行日期的加减操作。例如,获取当前时间一周后的订单:

SELECT * FROM orders WHERE order_date = DATE_ADD(CURDATE(), INTERVAL 7 DAY);

DATE_ADD() 函数用于在给定日期的基础上增加指定的时间间隔。常用语法为:

  • date:基础日期。
  • INTERVAL expr unit:需要增加的时间间隔,其中 expr 表示时间量,unit 表示时间单位。

常见的 unit 单位有:

  • DAY:天
  • MONTH:月
  • YEAR:年
  • HOUR:小时
  • MINUTE:分钟
  • SECOND:秒

四、CURDATE/CURTIME/NOW函数

1. CURDATE() 函数

CURDATE() 用于返回当前系统的日期,不包含时间部分。返回的日期格式为 YYYY-MM-DD,可以直接用于查询或插入操作。

示例:
SELECT CURDATE() AS current_date;

输出示例:

+--------------+
| current_date |
+--------------+
| 2024-09-05   |
+--------------+
使用场景:

适用于仅需要获取当前日期,不关心具体时间的业务逻辑。例如,在电商系统中,查询当天的所有订单:

SELECT * FROM orders WHERE order_date = CURDATE();

2. CURTIME() 函数

CURTIME() 用于返回当前系统的时间,不包含日期部分。返回的时间格式为 HH:MM:SS,显示小时、分钟和秒。

示例:
SELECT CURTIME() AS current_time;

输出示例:

+--------------+
| current_time |
+--------------+
| 14:45:30     |
+--------------+
使用场景:

适用于需要精确记录或查询当前时间而不涉及日期的业务逻辑。例如,查询某个时间段内的用户访问记录:

SELECT * FROM access_logs WHERE access_time BETWEEN '10:00:00' AND CURTIME();

3. NOW() 函数

NOW() 用于返回当前系统的日期和时间,返回格式为 YYYY-MM-DD HH:MM:SS。它包含了完整的日期和时间信息,适用于需要同时记录或查询日期和时间的场景。

示例:
SELECT NOW() AS current_datetime;

输出示例:

+---------------------+
| current_datetime    |
+---------------------+
| 2024-09-05 14:45:30 |
+---------------------+
使用场景:

适用于需要记录精确到秒的时间戳的业务逻辑。例如,在订单生成时,通常使用

NOW()

来记录订单的创建时间:

INSERT INTO orders (order_date) VALUES (NOW());

4. CURDATE()CURTIME()NOW() 的区别

函数返回值类型数据格式用途
CURDATE()日期YYYY-MM-DD返回当前日期,常用于日期相关操作
CURTIME()时间HH:MM:SS返回当前时间,不包含日期部分
NOW()日期和时间YYYY-MM-DD HH:MM:SS返回当前日期和时间,适合同时记录日期与时间

五、常见问题及解决方案

在实际业务中,电商系统常常遇到一些日期处理相关的常见问题,以下是几种常见问题及其解决方案。

1. 时区问题

在多时区环境下,DATETIMETIMESTAMP 类型的处理可能会出现不一致的问题。TIMESTAMP 会根据服务器的时区进行转换,因此在不同的时区可能会显示不同的时间。为了解决这个问题,可以设置全局时区:

SET GLOBAL time_zone = '+8:00'; -- 设置为东八区

2. 日期格式不一致

在存储和查询时,可能会遇到不同的日期格式不一致的问题。解决方案是统一使用 DATE_FORMAT()STR_TO_DATE() 函数进行转换。例如,确保所有输入的日期都是 YYYY-MM-DD 格式:

SELECT * FROM orders WHERE order_date = STR_TO_DATE('2023-08-30', '%Y-%m-%d');

3. 跨月份或跨季度的日期处理

在电商系统中,经常需要统计跨月份或跨季度的订单数据。可以结合 DATE_FORMAT()BETWEEN 操作符来实现跨时间段的查询。例如,查询跨两个月的订单:

SELECT * FROM orders WHERE order_date BETWEEN '2023-07-01' AND '2023-08-31';

4. 日期字段的索引优化

在处理大规模订单数据时,日期字段的查询性能可能会成为瓶颈。可以通过在日期字段上创建索引来提高查询效率:

CREATE INDEX idx_order_date ON orders(order_date);

六、总结

本文详细介绍了 MySQL 中的日期处理,涵盖了日期类型、日期与字符串和时间戳之间的转换、常用日期函数及其在电商系统中的应用场景。同时,针对一些常见问题提供了有效的解决方案。在实际开发中,掌握 MySQL 的日期操作不仅可以提高开发效率,还能更好地解决复杂的业务需求。


http://www.ppmy.cn/ops/109852.html

相关文章

深兰科技董事长陈海波出席《中马建交五十周年高级别经贸合作》

2024年9月3日,中马建交50周年高级别经贸合作交流会暨马来西亚第九任首相VIP欢迎晚宴在北京隆重举行,深兰科技创始人、董事长陈海波先生应邀出席。 会议期间,双方举行了品牌出海合作签约仪式。在马来西亚首相雅各布先生的见证下,深…

C语言知识体系思维导图

为了更清晰地描述C语言知识体系,笔者用一个结构化的思维导图来概括其主要组成部分。见下: 这个思维导图旨在提供一个全面而系统的视角,帮助学习者逐步构建扎实的C语言知识体系。随着学习的深入,可以根据个人兴趣和职业需求&#x…

软件架构风格

五大架构风格 1、数据流风格 子风格包括:批处理风格、管道-过滤器风格 2、调用/返回风格 子风格包括:主程序/子程序风格、面向对象风格、分层架构风格 3、独立构件风格 子风格包括:进程通信风格、事件驱动系统(隐式调用&…

【Shiro】Shiro 的学习教程(一)之快速入门

目录 1、Shiro 简介2、Shiro 认证、授权2.1、认证2.2、授权 3、快速入门4、自定义 Realm5、加密6、实现授权 1、Shiro 简介 Shiro 官网:https://shiro.apache.org/ Shiro 是一个功能强大且易于使用的 Java 安全框架,它执行身份验证、授权、加密和会话管…

Leetcode面试经典150题-55.跳跃游戏

解法都在代码里,不懂就留言或者私信 class Solution {public boolean canJump(int[] nums) {/**如果就一个位置,你本来就在这,肯定可以跳到*/if(nums.length 1) {return true;}/**这个题的解题思路是遍历数组,如果当前位置不在之…

【自用】计算机网络湖科大教书匠笔记 第一章 概述

文章目录 因特网概述三种交换方式:电路交换、分组交换和报文交换计网的定义及分类计网的性能指标计算机网络体系结构 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成 多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范…

SpringBoot 读取配置文件的4种方式

文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/…

MyBatis 源码解析:BatchExecutor 与 SimpleExecutor 详解

摘要 在 MyBatis 中,Executor 是执行 SQL 语句的核心组件。SimpleExecutor 和 BatchExecutor 是 Executor 的两种重要实现方式:前者负责简单的 SQL 执行,后者支持批量 SQL 执行。本文将通过自定义实现 BatchExecutor 和 SimpleExecutor&…

如何将Windows风格的剪切和粘贴添加到Mac访达中

你可以在Mac上剪切和粘贴,但此功能在访达中的行为不同。这可能会让新手感到不适,甚至可能会让铁杆Mac用户感到困扰。幸运的是,有一个小的免费应用程序可以“修复”这种不一致。 使用Command X剪切文件和文件夹 Command X是一款免费应用程序,它为Mac上的文件和文件夹添加了…

启动spring boot项目时,第三方jar包扫描不到的问题

讲述一下遇到的问题: 在启动类Application上使用ComponentScan 这个注解来扫描第三方的包,然后就会出现报错。异常就是无法加载本地的bean,但是可以加载到第三方的bean; 了解过spring boot启动流程的都知道,Springboo…

实操搭建battery-historian平台

1 在D盘新建一个文件夹:gosrc 2git clone https://github.com/google/battery-historian.git 3 cd 到D:\gosrc\battery-historian>go mod init gosrc初始化模块名为gosrc,你可以自定义自己的名字 4// 执行该命令,更换为国内代理地址 go en…

外观模式facade

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/facade 为程序库、 框架或其他复杂类提供一个简单的接口 把要做的事全放在一个类里给他做了,然后要用的时候直接创建这个类的实例

享元模式flyweight

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/flyweight 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。享元会将不同对象的相同数据进行缓存以节省内存。 factory里面treeType共用了

前端算法(持续更新)

1、最大的钻石 1楼到n楼的每层电梯口都放着一个钻石,钻石大小不一。你从电梯1楼到n楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能最大的钻石? 解题思路: 这是一个经典的动态规划问题&#xff…

策略模式的小记

策略模式 策略模式支付系统【场景再现】硬编码完成不同的支付策略使用策略模式,对比不同(1)支付策略接口(2)具体的支付策略类(3)上下文(4)客户端(5&#xff0…

高效物流管理从固乔快递批量查询助手开始

固乔快递批量查询助手:物流管理的智能化升级 固乔快递查询助手:批量追踪,物流无忧 轻松应对海量单号,固乔快递批量查询助手来帮忙 跨境电商新利器:固乔快递批量查询助手 高效物流管理从固乔快递批量查询助手开始 …

安装FTP服务器教程

一。安装vsftpd yum install vsftpd 二。修改配置文件,匿名账户具有访问,上传和创建目录的权限 vim /etc/vsftpd/vsftpd.conf (红色进行设置放开YES) local_enable:本地登陆控制,no表示禁止,ye…

大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己,而软件的根基是代码生成。代码生成第一波就是AI辅助开发,这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用,为什么会是辅助编程,这里说下什么: 必…

i++与++i在for循环中效果一样?

首先说结果 是的,在Visual Studio 2022中,不同于直接printf,在for循环中的i与i是同样的效果(都当作了i) 这是编译器干的好事。 如图比对 i i 原因探寻 | i i的底层原理 找到一篇博客,我目前还看不太明…

Hive 本地启动时报错 Persistence Manager has been closed

Hive 本地启动时报错 Persistence Manager has been closed 2024-09-07 17:21:45 ERROR RetryingHMSHandler:215 - Retrying HMSHandler after 2000 ms (attempt 2 of 10) with error: javax.jdo.JDOFatalUserException: Persistence Manager has been closedat org.datanucle…