mysql中datetime和timestamp的区别

记得有一次,我在公司成立之初是做数据库优化的。
那么你还在使用MySQL 5 .6 版本。
同事对成员负责模块的角色。
他告诉我,他遇到了一个奇怪的问题:用户购买的订阅服务的有效期超过1 0年,但数据库中的数据字段只显示1 0年前的日期。
当我看到这一幕时,事情是这样发生的。
当时我还记得那是2 01 8 年4 月,我苦恼了两天,最后发现问题出在指示类型上。

这个案例让我意识到,在设计数据库时,数据类型的选择真的很关键。
就像日期时间和时间指示一样,虽然它们都使用时态和时间,但它们之间有很大的区别。
例如,时间可以存储较大量的时间,而时间的指示则受到存储和时区差异的限制。
但有时我也很好奇,如果他们选择了日期和时间,会不会出现这样的问题?等等,还有一件事,我突然想到,如果我们能有一种方法可以自动检测并转换这些类型的数据,是不是就可以避免类似的问题了?

Mysql 中日期比较大小的方法有哪些?

老实说,要比较 MySQL 中的日期大小,请使用符号 >ah 日期一般以YYYY-MM-DD格式存储,字典顺序是按时间顺序排列的。
所以它直接工作而不是字符串。

例如,您是 1 月 1 日。
如果要选择 date_column 中日期在 2 02 3 年之后的行,请写入 date_column > '2 02 3 -01 -01 '。

如果要比较当前日期,请使用 CURDATE()。
例如,date_column = CURDATE() 选择包含今天日期的行。

您想知道约会迟了多少天吗?使用 DATEDIFF()。
例如,DATEDIFF(date_column, CURDATE()) = 7 ;选择与今天相隔 7 天的课程。

如果日期以其他格式存储,例如DD/MM/YYYY,则需要使用STR_TO_DATE()来更改它。
LIKE STR_TO_DATE(date_string_column, '%d/%m/%Y') > '2 02 3 -01 -01 '
或者您可以使用 CAST() 或 CONVERT()。
例如,CAST(date_string_column AS DATE) > '2 02 3 -01 -01 '。

如果列的类型是DATETIME或TIMESTAMP;您还必须注意与日期相比的时间段。
date_column > like '2 02 3 -01 -01 00:00:00'
简而言之,列就是DATE,只要是DATETIME和TIMESTAMP。
如果存储字符串,则需要使用 STR_TO_DATE()、CAST() 或 CONVERT() 对其进行转换。

MyBatis 中如何比较 MySQL 的 datetime 类型与 Java 类型的大小?

我记得上次选秀时发生了一些奇怪的事情。
未正确选择报告的时间范围。
明确选择在晚上 1 1 :00 之间。
和凌晨 1 :00,但结果数据为空。
经过检查发现是MyBatis对日期字符串的处理存在问题。
MySQL端的日期时间格式是YYYY-MM-DD HH:MI:SS,Java端将其传递为02 /2 8 /2 02 4 晚上1 1 :5 9 ,但MyBatis只是将其视为02 /2 9 /2 02 4 这个问题首先从MyBatis如何处理日期和时间开始。

第一种方法是直接使用java.util.Date。
这种方法的好处是MyBatis会自动帮你转换类型,所以你不用担心格式问题。
就像上次重构命令查询界面,将字符串改为date一样,时间范围突然变得正常了。
在 XML 中写入 ParameterType="java.util.Date",Java 代码使用 SimpleDateFormat 将字符串转换为 Date,如下所示: 爪哇 SimpleDateFormat 格式 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 开始日期 = format.parse("2 02 4 -02 -2 8 2 3 :5 9 :5 9 "); Date end = format.parse("2 02 4 -02 -2 8 2 3 :5 9 :5 8 ");
关键是参数类型必须一致,否则MyBatis会抛出TypeMismatchDataAccessException。
记得上次有新的团队成员直接通过LocalDate,但是报错了。
实在是太惊人了。

第二种方式是传递String。
这种方法最简单,但风险也最大。
上次有个实习生把HH:mm:ss写成小写的hh:mm:ss,导致数据库直接报错。
在XML中,parameterType=“java.lang.String”就足够了,Java代码直接传递字符串: 爪哇 字符串开头=“2 02 4 -02 -2 8 2 3 :5 9 :5 9 ”; String end = "2 02 4 -02 -2 8 2 3 :5 9 :5 8 ";
但是要注意时区问题。
最新测试环境使用UTC,开发环境为东八区。
直接通道传输会造成时滞。
此时,您需要在Java中处理时区,如下所示: 爪哇 ZonedDateTime zStart = ZonedDateTime.parse("2 02 4 -02 -2 8 T2 3 :5 9 :5 9 +08 :00"); ZonedDateTime zEnd = ZonedDateTime.parse("2 02 4 -02 -2 8 T2 3 :5 9 :5 8 +08 :00");
但是,这会增加代码的复杂度,这是不值得的。

一般来说,使用Date类型比较安全,尤其是需要进行时间操作的时候。
上次我们计算订单到期时间时,使用Date的getTime()方法比处理字符串要简单得多。
但使用字符串也有优点,例如能够传递空值或处理不完整的时间(例如仅传递日期)。
关键是格式要统一。
在上次测试环境中,有同事发送02 /2 8 /2 02 4 ,结果被MySQL视为0000-00-00。

等一下,我突然想到一件事。
如果数据库中的日期时间字段可以为空,那么从Java传递日期会出现问题吗?我必须测试一下。