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

老实说,MySQL 时间范围比这个好,而且使用频率很高。
举个例子吧。

比如有一个order表,里面存储的是订单。
它具有订单号和订单时间等字段。
现在我想查看过去一周的订单。
看看这个SQL:
sql 从订单中选择 WHERE order_time >= DATE_SUB(NOW(), INTERVAL 1 WEEK);
这段代码是什么意思? NOW() 是当前时间,DATE_SUB(NOW(), INTERVAL 1 WEEK) 是当前时间提前一周。
所以这个查询旨在查找 order_time 大于或等于一周前的所有订单。

逐一分析,实际上是基于几个函数。
例如,NOW() 获取当前时间,DATE_SUB() 减去向前的时间,DATE_ADD() 添加向前的时间。
这些功能非常有用。

注意时间类型。
MySQL 有 DATE、TIME、DATETIME 和 TIMESTAMP 等类型。
验证时间范围时,必须使用正确的类型并且格式必须相同。
如果同时有DATE和DATETIME也不用担心,肯定是错误的。

条件也需要正确选择。
为了测试一个时间范围,通常使用“大于或等于”和“小于或等于”。
此 SQL 使用值“大于或等于”,这意味着“一周内”,包括一周前的点。

索引也很重要。
如果您经常检查时间范围,则对时间字段建立索引会更快。
例如,如果您想每天检查上周的订单,那么添加索引就有意义。
如果没有索引,每次都要扫描整个表,速度非常慢。

仅此而已。
实际使用时,根据自己的需要配置SQL。
如果索引使用得当,查询会很快。

MySQL使用IN语句查询时间范围mysql中in查看时间

说白了,用IN来检查时间间隔不太可靠,但在某些场景下可以省事。
这很棘手,因为 MySQL 的 IN 不支持连续日期,因此您必须手动计数或使用函数来创建数据集。

扩展一下,使用 IN 查看一天的范围非常简单。
例如,去年我们运行了那个电子商务事件并检查了“2 02 3 -04 -1 2 ”到“2 02 3 -04 -1 2 ”的数据。
仅连续两次约会。
还有一点,如果你想检查一周,你应该使用 DATE_SUB('2 02 3 -04 -1 2 ', INTERVAL 7 DAY) 创建起点和终点作为示例。
然而,以这种方式写入3 000级数据将会终止,因为IN内部会被分割成多个OR条件。
还有另一个重要的细节。
使用函数计算日期后记得建立索引,否则查询速度会比直接使用BETWEEN慢。

思路:一开始我以为可以使用STR_TO_DATE('2 02 3 -04 -1 2 ', '%Y-%m-%d')直接传递参数。
后来我发现 IN 不支持变量,必须预先计算和硬编码。
等等,还有一件事。
如果数据跨度特别大,比如三个月,使用 DATE_SUB('2 02 3 -04 -1 2 ', INTERVAL 3 MONTH) 会计算出非法日期,应该使用 LAST_DAY 等函数来处理下限。

注意:当IN中的日期列表特别长时,MySQL会报“The number of columns specified for the subquery does not match the number of columns in the SELECT list”,因为函数会为每个日期生成一个临时列。
建议使用临时表或JOIN而不是IN。

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

时间戳自动更新。
定义:timestamp_column TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
效果:当数据更新时,该字段自动变为当前时间。

日期/时间会自动更新。
定义: datetime_column CURRENT_TIMESTAMP 更新的 DATETIME。
注意:它不会自动重置为当前时间。

范围查询: SQL:从表中选择“2 02 3 -01 -01 ”和“2 02 3 -01 -02 ”之间的 datetime_column。
Java+MyBatis: @Select("从表timestamp_column WHERE BETWEEN {startTime} AND {endTime}中选择") 列表结果 = mapper.selectByRange(startTime, endTime);
区别: 时间戳:存储从 1 9 7 0 年到 2 03 8 年的 UTC 时间。
datetime:存储本地时间,范围1 000-9 9 9 9
使用时间戳来更改时区和日期/时间以获得准确的记录。