MySQL时间如何比较_MySQL时间字段比较与查询教程

2 02 2 年,之前在做一个项目,比较时间确实很烦人。
MySQL中的类型不同,处理方法也要改变。
我开始随机使用它,并且性能很糟糕。

例如,如果您使用大于号和小于号,那没关系,对吧?比如要查看2 02 3 年1 月1 日以后的数据,可以直接输入create_time > '2 02 3 -01 -01 00:00:00',看起来没问题。
但有时候你用BETWEEN,比如查1 月份的数据,把event_date写在'2 02 3 -01 -01 '和'3 1 -01 -2 02 3 '之间,你会发现我的朋友,可能查不到3 1 号中午1 2 点的数据。
我当时很困惑。
我找啊找,但没有找到。
我以为某个地方有错别字。
后来我意识到 DATETIME 和 BETWEEN 类型有自己的参数问题。
后来我改成了>='2 02 3 -01 -01 00:00:00' AND <'2 02 3 -02 -01 00:00:00',这样数据就出现在3 1 号中午1 2 点。
正如您所看到的,您是否必须显式地转换和编码时间点以避免这个陷阱? TIMESTAMP 和 DATETIME 更烦人。
时间戳会根据时区自动更改。
它存储协调世界时 (UTC),但显示时会发生变化。
我当时在美国做一个项目,服务器运行在 UTC 时区。
我插入了一个时间,例如“2 02 3 -01 -01 08 :00:00”,它存储了UTC时间。
原来我所在的位置是东八区,我一看显示的是‘2 02 3 -01 -01 1 6 :00:00’。
如果不注意这一点,活动期间肯定会出问题。
后来我才意识到,是的,使用UTC时间来存储,然后移动到应用层。
例如使用CONVERT_TZ('2 02 3 -01 -01 08 :00:00', '+00:00', '+08 :00'),可以转换为北京时间。
正如您所看到的,您确实必须小心时区。

指数也很重要。
例如,如果你在order_time上创建了索引,然后使用YEAR(order_time) = 2 02 3 ,那么索引就会白创建,因为它使用了YEAR函数触发的字段中的函数,索引就会失效。
后来验证了2 02 3 年1 月的一个订单,写了order_time >= '2 02 3 -01 -01 00:00:00' AND order_time < '2 02 3 -02 -01 00:00:00',这样就可以使用索引了。
正如你所看到的,你必须明确地写出日期范围吗?您不能直接在字段上使用函数。

所以,后来我总结了几点:第一,显式转换,不要盲目使用隐式转换;二、统一使用UTC时间存储,并在应用层进行时区转换;三、创建索引时不要对字段使用函数指数。
正如你所看到的,它们只有几个,我花了很多时间去挖掘兔子洞,然后才总结出来。
也许我有点极端,但我认为这是最重要的。
嗯,我就不多说了,仅此而已。

MySQL datetime timestamp 以及如何自动更新,如何实现范围查询

时间戳字段会自动更新为 ONUPDATECURRENT_TIMESTAMP。
日期和时间字段不会自动更新,需要明确的默认值或触发器。
使用 NOW() 和 INTERVAL 进行范围查询(例如,SELECTFROMtableWHEREtime> NOW()-INTERVAL6 0SECOND)。
Java+MyBatis 传递一个参数来检查范围,并在 XML 中写入 SELECTFROMtableWHEREtime> {startTime}ANDtime< {endTime}
时间戳存储 UTC 时间,日期时间存储本地时间。
时间戳范围从 1 9 7 0 到 2 03 8 日期和时间范围为 1 000-9 9 9 9 使用跨时区的时间戳和日期时间来实现本地精度。

MySQL时间范围比较:实例与解析

哦,让我告诉你一些我当时做了什么。
大概是2 008 年左右,当时我刚刚接手一个电商网站的数据库,使用的是MySQL。
就在这时,系统突然报错。
检查了半天,发现查询速度太慢,数据库CPU被烧坏了。

看,我的表名为“订单”,它存储订单。
每个订单都有一个名为 order_time 的时间戳。
当时老板说他需要检查一下上周的订单,看看是否有问题。
我写了一个SQL:
sql 从订单中选择 WHERE order_time >= DATE_SUB(TIME(), INTERVAL 1 WEEK);
我知道这个说法。
NOW() 是当前时间,DATE_SUB 向后递减。
我尝试运行一下,但是哦,CPU又爆炸了!我就纳闷了,这个表才几万条数据,为什么这么慢呢?
后来我想了一下,问题可能就出在这里。
想一想,order_time是什么类型?如果只是一个VARCHAR,每次比较大小的时候都要转换成字符串,肯定会很慢。
我很快检查了表结构。
嘿,这一栏是日期时间。
嗯,问题可能不是类型。

我又查看了执行计划,发现这一列没有索引。
那一刻我脑子“嗡嗡”地响,索引!我快速添加了一个索引:
sql 在订单上创建索引 idx_order_time(order_time);
添加索引后,我将再次运行查询,瞧!几秒钟就出来了!您会看到,有时问题就像缺少索引一样简单。
想想看,如果每天运行数百个这样的查询而不建立索引,数据库将会非常沮丧。

后来我总结了几点,给大家讲一下:
1 .数据功能使用正确。
NOW()和DATE_SUB()使用起来很方便,但是不要在WHERE中做太复杂的计算。
如果能提前计算一下就更好了。
2 、时间类型必须选择正确。
DATE、TIME、DATETIME、TIMESTAMP,如果使用了错误的类型比例,就会进行类型转换,速度慢。
我当时正确使用了DATETIME。
3 . 索引是关键。
想想看,如果按时间查几万条数据,没有索引就全表扫描,CPU不就爆炸了吗?接下来,我向所有日期和时间字段添加索引,这些字段通常都大于彼此。

看,这就是它的工作原理。
理论就是理论。
如果您确实遇到问题,添加索引可能会解决它。
于是我就这样来到了这里,通过踩陷阱获得了经验。