详细分析Mysql中的STR_TO_DATE基本知识(全)

news2024/11/28 0:47:47

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
  • 3. 实战Demo
  • 4. Sql彩蛋
    • 4.1 LPAD函数
    • 4.2 SUBSTRING_INDEX函数
  • 5. Java彩蛋

前言

对于该知识点,主要因为数据库类型为String(类似2024-03-26),放置于后端操作后,需要自定义比较,而且不是在sql内存做处理,后续特别麻烦

1. 基本知识

STR_TO_DATE是MySQL中的一个日期时间处理函数,用于将字符串转换为日期时间类型。

它的基本用法是将一个包含日期时间信息的字符串转换为对应的日期时间类型

基本的语法如下:

STR_TO_DATE(str, format)
  • str:要转换为日期时间的字符串
  • format:指定了输入字符串的日期时间格式

返回一个日期时间类型的值,或者在无法解析输入字符串时返回NUL

对应的日期格式如下:

format参数定义了输入字符串的日期时间格式,可以包含各种日期时间格式化符号,如%Y%m%d等,用来表示年、月、日等不同部分

具体的格式化符号及其含义如下:(注意是两位数字。这里埋一个伏笔,如果遇到不是两位的也可做处理

  • %Y:四位年份
  • %y:两位年份
  • %m:两位月份
  • %c:月份(0-12)
  • %d:两位日期
  • %H:小时(00-23)
  • %h:小时(01-12)
  • %i:两位分钟
  • %s:两位秒数
  • %p:AM或PM

简单的示例如下:

  • 将字符串’2024-03-28’转换为日期类型SELECT STR_TO_DATE('2024-03-28', '%Y-%m-%d');,返回值为2024-03-28
  • 将字符串’Mar 28, 2024 10:30:00 PM’转换为日期时间类型SELECT STR_TO_DATE('Mar 28, 2024 10:30:00 PM', '%b %d, %Y %h:%i:%s %p');,返回值为2024-03-28 22:30:00

2. Demo

employee的表,其中有一个字段hire_date存储了员工的入职日期,类型为字符串

现在想将这个字段转换为日期类型,并进行一些基本的查询操作

CREATE TABLE employee (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    hire_date VARCHAR(20)
);

INSERT INTO employee (id, name, hire_date) VALUES
(1, 'John Doe', '2020-01-15'),
(2, 'Jane Smith', '2019-09-10'),
(3, 'Alice Johnson', '2021-03-25');

查询入职日期在2020年之后的员工:

SELECT * FROM employee WHERE STR_TO_DATE(hire_date, '%Y-%m-%d') > '2020-01-01';

查询入职日期在2019年的员工:

SELECT * FROM employee WHERE STR_TO_DATE(hire_date, '%Y-%m-%d') BETWEEN '2019-01-01' AND '2019-12-31';

3. 实战Demo

类似如下Demo

SELECT * FROM equipment_tyre_repare_order_detail where status = 1  ORDER BY STR_TO_DATE(repare_time, '%Y-%m-%d')

最终截图如下:

在这里插入图片描述

如果遇到无法解析的情况可以更换为如下:
(日期字段repare_time有一位月份或日期的情况,可以使用DATE_FORMAT函数来处理,DATE_FORMAT函数允许您指定日期的格式,以便正确解析日期字符串)

SELECT * FROM equipment_tyre_repare_order_detail 
WHERE status = 1 
AND STR_TO_DATE(DATE_FORMAT(repare_time, '%Y-%m-%d'), '%Y-%m-%d');

如果还是不行,可以再次升级:
使用如下代码:(LPAD函数来确保日期和月份是两位数,使用STR_TO_DATE函数将其转换为日期对象,并对其进行排序)

SELECT * FROM equipment_tyre_repare_order_detail 
WHERE status = 1 
ORDER BY STR_TO_DATE(
    CONCAT(
        SUBSTRING_INDEX(repare_time, '-', 1), '-', 
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(repare_time, '-', -2), '-', 1), 2, '0'), '-', 
        LPAD(SUBSTRING_INDEX(repare_time, '-', -1), 2, '0')
    ),
    '%Y-%m-%d'
);

4. Sql彩蛋

上述Sql中提及LPAD以及SUBSTRING_INDEX函数

知识点补充如下:

4.1 LPAD函数

LPAD是MySQL中的一个字符串函数,用于向一个字符串的左侧添加指定的字符,直到达到指定的长度

它的基本语法如下:LPAD(str, len, padstr)

  • str:要进行填充的字符串
  • len:填充后字符串的长度
  • padstr:要填充的字符或子字符串

Demo如下:

假有一个字符串’123’,现在希望将其填充到长度为5,用字符’0’进行填充,即在字符串的左侧填充两个’0’,使其长度达到5

SELECT LPAD('123', 5, '0');

最终得到结果00123

4.2 SUBSTRING_INDEX函数

SUBSTRING_INDEX 是 MySQL 中的一个字符串函数,用于从一个字符串中获取子字符串,基于指定的分隔符和索引位置

SUBSTRING_INDEX(str, delim, count)
  • str:要处理的字符串
  • delim:分隔符,用于标识子字符串的边界
  • count:要返回的子字符串的数量

从字符串 str 的开头或结尾开始,根据 delim 分隔符将其分割为多个子字符串,并返回其中的第 count 个子字符串

  • 如果 count 为正数,则从字符串开头开始计数
  • 如果 count 为负数,则从字符串结尾开始计数
  • 如果 count 为0,则返回整个字符串

Demo:

  1. 假设有一个字符串 ‘apple,banana,cherry,grape’,现在希望从该字符串中获取第二个逗号分隔的子字符串,即 ‘banana’
SELECT SUBSTRING_INDEX('apple,banana,cherry,grape', ',', 2);

返回apple,banana

  1. 从字符串的末尾开始计数,可以使用负数作为 count 参数,例如获取倒数第二个逗号后的子字符串
SELECT SUBSTRING_INDEX('apple,banana,cherry,grape', ',', -2);

返回 cherry,grape

5. Java彩蛋

置于为何要分析这个函数,源头在于一开始我用的Java代码处理,但是一直无法生效排序,后续才使用Sql内存来处理,总体而言推荐使用Sql来处理,以下代码为题外话

在这里插入图片描述

代码如下:

/**
 * 轮胎更换记录的条件查询
 * @param tyreRepareOrderDetailVo
 * @param query
 * @return
 */
@Override
public IPage<TyreRepareOrderDetail> inquire(TyreRepareOrderDetailVO tyreRepareOrderDetailVo, Query query){
	QueryWrapper<TyreRepareOrderDetail> wrapper = new QueryWrapper<TyreRepareOrderDetail>()
		.eq("status", 1)
		.orderByAsc("equipment_no") // 按照车号升序排列
		.orderByDesc("replace_location");
	
	IPage<TyreRepareOrderDetail> pages = super.page(Condition.getPage(query), wrapper);

	// 对更换日期进行排序
	List<TyreRepareOrderDetail> records = pages.getRecords();
	Collections.sort(records, new Comparator<TyreRepareOrderDetail>() {
		@Override
		public int compare(TyreRepareOrderDetail detail1, TyreRepareOrderDetail detail2) {
			// 比较更换日期
			int compareResult = compareDateStrings(detail1.getRepareTime(), detail2.getRepareTime());
			if (compareResult != 0) {
				return compareResult;
			}
			// 如果更换日期相同,则比较车号
			compareResult = detail1.getEquipmentNo().compareTo(detail2.getEquipmentNo());
			if (compareResult != 0) {
				return compareResult;
			}
			// 如果车号相同,则比较更换位置
			return detail1.getReplaceLocation().compareTo(detail2.getReplaceLocation());
		}

		// 比较日期字符串
		private int compareDateStrings(String dateString1, String dateString2) {
			LocalDate date1 = parseDateString(dateString1);
			LocalDate date2 = parseDateString(dateString2);
			return date2.compareTo(date1); // 降序排序
		}

		private LocalDate parseDateString(String dateString) {
			// 使用 "-" 进行分割
			String[] parts = dateString.split("-");

			// 根据日期字符串中各部分的值判断是否需要补零
			String year = parts[0];
			String month = parts[1].length() == 1 ? "0" + parts[1] : parts[1];
			String day = parts[2].length() == 1 ? "0" + parts[2] : parts[2];

			// 拼接成完整的日期字符串
			String formattedDate = String.format("%s-%s-%s", year, month, day);

			// 使用 DateTimeFormatter 解析日期字符串
			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
			return LocalDate.parse(formattedDate, formatter);
		}
	});
	// 更新结果集,不设置这个一直都是单个页面的排序
	pages.setRecords(records);
	return pages;
}

后续将其整理成自定义的排序模块:(类似模版使用,专门处理数据库为String,但是后端排序需要使用日期格式)
总体而言还是推荐使用Sql内存排序,毕竟取出在Java代码排序也费事费时

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;

public class DateComparator implements Comparator<String> {
    @Override
    public int compare(String dateString1, String dateString2) {
        LocalDate date1 = parseDateString(dateString1);
        LocalDate date2 = parseDateString(dateString2);
        return date2.compareTo(date1); // 降序排序
    }

    private LocalDate parseDateString(String dateString) {
        // 使用 "-" 进行分割
        String[] parts = dateString.split("-");
        
        // 根据日期字符串中各部分的值判断是否需要补零
        String year = parts[0];
        String month = parts[1].length() == 1 ? "0" + parts[1] : parts[1];
        String day = parts[2].length() == 1 ? "0" + parts[2] : parts[2];
        
        // 拼接成完整的日期字符串
        String formattedDate = String.format("%s-%s-%s", year, month, day);
        
        // 使用 DateTimeFormatter 解析日期字符串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return LocalDate.parse(formattedDate, formatter);
    }
}

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

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

相关文章

LLaMA-Factory微调(sft)ChatGLM3-6B保姆教程

LLaMA-Factory微调&#xff08;sft&#xff09;ChatGLM3-6B保姆教程 准备 1、下载 下载LLaMA-Factory下载ChatGLM3-6B下载ChatGLM3windows下载CUDA ToolKit 12.1 &#xff08;本人是在windows进行训练的&#xff0c;显卡GTX 1660 Ti&#xff09; CUDA安装完毕后&#xff0c…

HCIP---MGRE和GRE实验

一、配置ip R1: [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [R1-GigabitEthernet0/0/0]int s4/0/0 [R1-Serial4/0/0]ip add 15.1.1.1 24 [R1]ip route-static 0.0.0.0 0 15.1.1.5 R2: [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 192.168.2.2…

GROBID库文献解析

1. 起因 由于某些原因需要在大量的文献中查找相关内容&#xff0c;手动实在是太慢了&#xff0c;所以选择了GROBID库进行文献批量解析 2. GROBID介绍 GROBID是一个机器学习库&#xff0c;用于将PDF等原始文档提取、解析和re-structuring为结构化的XML/TEI编码文档&#xff0…

C++第十四弹---模板初阶

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、泛型编程 2、函数模板 2.1、函数模板的概念 2.2、函数模板的格式 2.3、函数模板的原理 2.4、函数模板的实例化 2.5、模板参数的匹配原则 …

【学习】如何成为资深的软件测试工程师“大神”?

一个优秀的软件测试工程师不仅需要有深厚的技术知识和经验&#xff0c;还需要有良好的沟通能力、分析能力和问题解决能力。总的来说&#xff0c;一个"大神"一样的软件测试工程师应该是一个全面的技术专家&#xff0c;同时还需要有出色的沟通和问题解决能力&#xff0…

Mac 版 IDEA 中配置 GitLab

一、安装Git 在mac终端输入Git检测指令&#xff0c;可以通过git命令查看Git是否安装过&#xff0c;如果没有则会弹出安装按钮&#xff0c;如果安装过则会输出如下信息。 WMBdeMacBook-Pro:~ WENBO$ git usage: git [--version] [--help] [-C <path>] [-c namevalue][--…

ubuntu23.10配置RUST开发环境

系统版本: gcc版本 下载rustup安装脚本: curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc 默认已添加 使用环境变量立即生效 source ~/.bashrc 执行rust开发环境,在终端输入…

深度剖析:计算机集群在大数据体系中的关键角色和技术要点

什么是计算机集群&#xff1f; 计算机集群是一组相互连接的计算机&#xff08;服务器&#xff09;&#xff0c;它们协同工作以完成共同的任务。集群中的每个计算机节点都可以独立运行&#xff0c;但它们通过网络连接在一起&#xff0c;以实现更高的可靠性、性能和可扩展性。 典…

给虚拟机配置静态IP并使用FileZIlla在虚拟机和Windows之间传输文件(ssh和ftp两种方法)

一、配置操作系统网络 &#x1f338;下面的步骤主要是配置虚拟机的静态IP&#xff0c;方便后续用 FikeZilla 在windows和虚拟机之间传输文件&#xff08;否则用默认的ip分配方案为 DHCP ,每一次开机时的ip都是有可能不同的,这样就会导致每次远程连接都需要查看ip地址.&#xf…

Python | 非规则矩形投影添加斑马线边框

前言 在地图绘制领域&#xff0c;非规则投影的示例相对较少&#xff0c;通过几个python的示例可以更好地理解如何在不同投影类型和边界形状下绘制地图。 以下提供了一系列示例&#xff0c;演示了如何在地图中添加非规则边界和边框。这些示例涵盖了不同的投影类型和边界形状&a…

element-ui 表单校验,失去焦点/框内值改变,校验

前提&#xff1a;在el-form表单中&#xff0c;框中有值&#xff0c;失去焦点或者框内值改变的时候&#xff0c;校验提示&#xff0c;依旧没有消失el-select校验失效问题 之前el-select&#xff0c;trigger时候用的“blur”,导致失效&#xff0c;现在 el-select 统一改为"c…

PyTorch深度学习实战(40)——零样本学习(Zero-Shot Learning)

PyTorch深度学习实战&#xff08;40&#xff09;——零样本学习 0. 前言1. 零样本学习2. 实现零样本学习模型2.1 模型分析2.2 构建零样本学习模型 小结系列链接 0. 前言 零样本学习 (Zero-Shot Learning) 是一种机器学习方法&#xff0c;旨在解决传统监督学习中&#xff0c;当…

pulsar存在大量消费未ack的原因

问题起源&#xff1a; 某产品灰度上线后&#xff0c;从pulsar服务端监控发现存在一种现象&#xff1a;消费但未ack的信息不断增加&#xff0c;直到3000左右就稳定下来了且消费速度为0&#xff0c;但不清楚这3000是怎么来的&#xff0c;因为代码是消费到立马ack的&#xff1b; …

格雷希尔G10系列L150A和L200A气动快速连接器,在新能源汽车线束线缆剥线后的气密性测试密封方案

线束线缆在很多用电环境都有使用&#xff0c;比如说新能源汽车&#xff0c;从电池包放电开始&#xff0c;高低压、通讯都开始进行工作&#xff0c;线束在连接的地方需要具有较高的气密性和稳定性&#xff0c;才能保证车辆在不同环境下能够正常的运行。 线束在组装铜鼻子前需要剥…

【Oracle篇】expdp/impdp高效完成全部生产用户的全库迁移(第四篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣️❣️…

基于SpringBoot的游戏商城系统的设计与实现(论文+源码)_kaic

目录 1前言 1.1研究的背景及意义 1.2国内外的研究状况和发展趋势 2需求分析 2.1系统需求分析 2.1.1技术可行性 2.1.2经济可行性 2.1.3操作可行性 2.2系统的开发环境 2.2.1 Springboot框架 2.2.2 数据库Mysql 2.2.3 IntelliJ IDEA平台 2.2.4 Mybatis和MyBatis-plus 2.2.5 前端框…

火鸟门户同城模块

同城活动 同城活动是指在同一城市举办的活动&#xff0c;可以是多种类型&#xff0c;例如&#xff1a; 聚会&#xff1a;朋友聚会、同学聚会、兴趣爱好聚会等。展览&#xff1a;艺术​​展览、科技展览、文化展览等。演出节目&#xff1a;演唱会、音乐会、戏剧表演等。比赛项…

JumpServer 堡垒主机

JumpServer 堡垒机帮助企业以更安全的方式管控和登陆各种类型的资产 SSH&#xff1a;Linux/Unix/网络设备等Windows&#xff1a;Web方式连接/原生RDP连接数据库&#xff1a;MySQL、Oracle、SQLServer、PostgreSQL等Kubernetes&#xff1a;连接到K8s集群中的PodsWeb站点&#x…

Backend - gitea 首次建库(远端本地)

目录 一、建立远端储存库 1. 进入新增画面 2. 填写储存库名称&#xff08;如book&#xff09;&#xff0c;点击“建立”即可 二、本地关联远端储存库 1. 本地初始化储存库代码 &#xff08;1&#xff09;新建文件夹 &#xff08;2&#xff09;获取远端储存库 2. 本地编写…

前端学习<二>CSS基础——14-CSS3属性详解:Web字体

前言 开发人员可以为自已的网页指定特殊的字体&#xff08;将指定字体提前下载到站点中&#xff09;&#xff0c;无需考虑用户电脑上是否安装了此特殊字体。从此&#xff0c;把特殊字体处理成图片的方式便成为了过去。 支持程度比较好&#xff0c;甚至 IE 低版本的浏览器也能…