news 2026/1/30 4:30:10

一个在使用方法上的低级错误(MySQL场景)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个在使用方法上的低级错误(MySQL场景)

首先申明这个技术含量不高

  • 初始化问题数据。注意这里的t代表时间,数据类型是字符串。
  • 为什么用字符串来表示时间?那这就是问题所在。当初创建的人不懂。
  • 这个回答不知道满意吗?
mysql> create table t1 (id int,t varchar(20)); Query OK, 0 rows affected (0.02 sec) mysql> insert into t1 values (1,'2026-01-01 01:00:00'); Query OK, 1 row affected (0.00 sec) mysql> insert into t1 values (2,'2026-01-01 10:00:00'); Query OK, 1 row affected (0.00 sec) mysql> insert into t1 values (3,'2026-01-02 02:00:00'); Query OK, 1 row affected (0.00 sec) mysql> insert into t1 values (4,'2026-01-03 02:00:00'); Query OK, 1 row affected (0.00 sec) mysql> insert into t1 values (5,'2026-01-04 08:00:00'); Query OK, 1 row affected (0.00 sec) mysql> insert into t1 values (6,'2026-01-02 00:00:00'); Query OK, 1 row affected (0.01 sec) mysql> select * from t1; +------+---------------------+ | id | t | +------+---------------------+ | 1 | 2026-01-01 01:00:00 | | 2 | 2026-01-01 10:00:00 | | 3 | 2026-01-02 02:00:00 | | 4 | 2026-01-03 02:00:00 | | 5 | 2026-01-04 08:00:00 | | 6 | 2026-01-02 00:00:00 | +------+---------------------+ 6 rows in set (0.00 sec)
  • 如果查询小于等于1月2日的。注意我写了等于,但是结果是没有1月2日。这也可以理解。字符串就这样定义,从第一个字符开始算。哪怕是1月2日0点0分0秒也不属于范围。
  • 只有条件是小于1月3日,才能看到1月2日。
mysql> select * from t1 where t<='2026-01-02'; +------+---------------------+ | id | t | +------+---------------------+ | 1 | 2026-01-01 01:00:00 | | 2 | 2026-01-01 10:00:00 | +------+---------------------+ 2 rows in set (0.00 sec) mysql> select * from t1 where t<='2026-01-03'; +------+---------------------+ | id | t | +------+---------------------+ | 1 | 2026-01-01 01:00:00 | | 2 | 2026-01-01 10:00:00 | | 3 | 2026-01-02 02:00:00 | | 6 | 2026-01-02 00:00:00 | +------+---------------------+ 4 rows in set (0.00 sec)
  • 然后同样的表把字段类型换一下。把时间字段给于正经的时间类型。(不过时间精度只到天,因为有的系统场景只要到天就行了。前面模拟的时分秒的仅仅是为了展示说明0点的边界差异)
  • 可以看到,这个小于等于时候是能把1月2日时间查出来的。就这一点的差距,取数能查一天的数据量。
  • 我给别人演示,这就是他的问题所在。在Oracle中没这种问题。因为时间类型和字符类型的写法都不一样。
mysql> drop table t2; Query OK, 0 rows affected (0.01 sec) mysql> create table t2 as select * from t1; Query OK, 6 rows affected (0.03 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> alter table t2 modify t date; Query OK, 6 rows affected, 5 warnings (0.05 sec) Records: 6 Duplicates: 0 Warnings: 5 mysql> select * from t2; +------+------------+ | id | t | +------+------------+ | 1 | 2026-01-01 | | 2 | 2026-01-01 | | 3 | 2026-01-02 | | 4 | 2026-01-03 | | 5 | 2026-01-04 | | 6 | 2026-01-02 | +------+------------+ 6 rows in set (0.00 sec) mysql> select * from t2 where t<='2026-01-02'; +------+------------+ | id | t | +------+------------+ | 1 | 2026-01-01 | | 2 | 2026-01-01 | | 3 | 2026-01-02 | | 6 | 2026-01-02 | +------+------------+ 4 rows in set (0.00 sec)
  • 再换一下时间类型。这种场景下和第一张字符串时间取值几乎一致,区别是0点0分0秒的能查询的到。如果要1月2日所有的数据,条件还是要写小于1月3日。注意不要带=
mysql> create table t3 as select * from t1; Query OK, 6 rows affected (0.02 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> alter table t3 modify t datetime; Query OK, 6 rows affected (0.04 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> select * from t3; +------+---------------------+ | id | t | +------+---------------------+ | 1 | 2026-01-01 01:00:00 | | 2 | 2026-01-01 10:00:00 | | 3 | 2026-01-02 02:00:00 | | 4 | 2026-01-03 02:00:00 | | 5 | 2026-01-04 08:00:00 | | 6 | 2026-01-02 00:00:00 | +------+---------------------+ 6 rows in set (0.00 sec) mysql> select * from t3 where t<='2026-01-02'; +------+---------------------+ | id | t | +------+---------------------+ | 1 | 2026-01-01 01:00:00 | | 2 | 2026-01-01 10:00:00 | | 6 | 2026-01-02 00:00:00 | +------+---------------------+ 3 rows in set (0.00 sec)

错误是低级的,再结合数据类型就有点绕。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/25 12:45:46

java头歌-数组进阶

第一关 public static void main(String[] args) {//动态构建arr1int[] arr1 new int[3];Scanner sc new Scanner(System.in);for(int i 0 ; i< arr1.length ; i){arr1[i] sc.nextInt();}/********** Begin **********///创建数组arr2int[] arr2 new int[3];for (int i…

作者头像 李华
网站建设 2026/1/29 12:40:37

手写一个单例模式 (考虑线程安全)。

手写一个单例模式 (考虑线程安全) 关键词:单例模式, 线程安全, 设计模式, 双重检查锁定, 并发编程, 懒汉式, 饿汉式 摘要:单例模式是软件开发中最基础也最常用的设计模式之一,它保证一个类在整个系统中只有一个实例,并提供全局访问点。然而在多线程环境下,简单的单例实现可…

作者头像 李华
网站建设 2026/1/29 20:44:59

IDEA搭建SpringBoot,MyBatis,Mysql工程项目

目录 一、前言 二、项目结构 三、初始化项目 四、SpringBoot项目集成Mybatis编写接口 五、代码仓库 一、前言 构建一个基于Spring Boot框架的现代化Web应用程序&#xff0c;以满足[公司/组织名称]对于[业务需求描述]的需求。通过利用Spring Boot简化企业级应用开发的优势…

作者头像 李华
网站建设 2026/1/29 16:13:37

CSDN(中国软件开发网)作为中国领先的IT技术交流平台,每年都会基于社区活跃度、开发者关注热点

CSDN&#xff08;中国软件开发网&#xff09;作为中国领先的IT技术交流平台&#xff0c;每年都会基于社区活跃度、开发者关注热点、技术文章发布趋势、开源项目动态以及行业应用进展等多维度数据&#xff0c;发布年度技术趋势预测。以下是根据近年来的技术发展和CSDN社区动态总…

作者头像 李华
网站建设 2026/1/19 11:30:02

深度学习毕设项目推荐-深度学习基于python的CNN训练识别吃的美食基于python的深度学习CNN训练识别吃的美食

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/1/25 3:14:30

Java 进阶:如何让线程主动让出 CPU

Java 进阶如何让线程主动让出 CPU ThreadsleepThreadyieldThreadcurrentThreadsuspendObjectwaitLockSupportparkThreadstop Java 进阶&#xff1a;如何让线程主动让出 CPU Thread.sleep sleep 方法可以让线程主动让出 CPU&#xff0c;但是并不会释放锁。 /*** Causes the …

作者头像 李华