在 MySQL 数据库中,关于日期和时间的类型主要有以下几种:
1. **DATE**: 仅存储日期部分,格式为 `YYYY-MM-DD`,例如 `2023-10-31`。
2. **TIME**: 仅存储时间部分,格式为 `HH:MM:SS`,例如 `14:30:00`。
3. **DATETIME**: 存储日期和时间,格式为 `YYYY-MM-DD HH:MM:SS`,例如 `2023-10-31 14:30:00`。
4. **TIMESTAMP**: 存储日期和时间,格式为 `YYYY-MM-DD HH:MM:SS`,并且会根据时区进行转换,通常用于记录数据的创建和修改时间。
5. **YEAR**: 存储年份,格式为 `YYYY`,例如 `2023`。
这些类型可以根据具体需求选择使用,以便在数据库中存储和处理日期和时间数据。
在 MySQL 中,`TIMESTAMP` 类型有一些限制和注意事项:
1. **时区影响**:`TIMESTAMP` 会根据服务器的时区进行存储和检索,因此在不同的时区环境中可能会导致时间不一致的问题。
2. **自动初始化和更新**:`TIMESTAMP` 列可以自动初始化为当前时间或在记录更新时自动更新为当前时间。这在某些情况下很有用,但也可能导致意外的行为。
3. **范围限制**:`TIMESTAMP` 的有效范围是 `1970-01-01 00:00:01` UTC 到 `2038-01-19 03:14:07` UTC。如果需要存储超出此范围的日期和时间,建议使用 `DATETIME` 类型。
4. **默认值限制**:在 MySQL 5.6 之前,`TIMESTAMP` 列必须有一个默认值,通常是 `CURRENT_TIMESTAMP`。在 MySQL 5.6 及之后的版本中,这个限制有所放宽。
5. **存储大小**:`TIMESTAMP` 占用 4 字节的存储空间,而 `DATETIME` 占用 8 字节。
这些限制在使用 `TIMESTAMP` 类型时需要注意,以确保数据的正确性和一致性。
如果保存的时间是 1900-01-01 00:00:00,
timestamp 类型是保存不了的
一般使用DATETIME类型就可以了。包含了 日期和时间,如果有些场景只需要日期,比如按天维度的,那么用DATE来存储。
建议不使用 timestamp类型,因为存储范围有限。
所以,首先 DATETIME,其次根据需要选 DATE
再JDK中,提供了三种日期:
1.
java.util.Date
util 包下的Date,就是 包含日期和时间,不论数据库中是什么类型。
例如:
`Mon Jan 01 00:00:00 CST 1900` 这种格式是 Java 中 `Date` 类的默认字符串表示形式。它包含以下部分:
1. **星期**:`Mon` 表示星期一。
2. **月份**:`Jan` 表示一月。
3. **日期**:`01` 表示1号。
4. **时间**:`00:00:00` 表示午夜零点。
5. **时区**:`CST` 表示中国标准时间(China Standard Time)。
6. **年份**:`1900` 表示年份1900年。
这种格式是通过 `Date` 类的 `toString()` 方法生成的。
对于表结构中:
1 如果的Date ,转为util下的Date时, 时间部分是 00:00:00
2. 如果是Time,转为util下的Date时,日期部分是 1970-01-01
3. 如果是DATETIME 或者 TIMESTAMP,转为util下的Date时,没问题,包含日期 时间
2.
java.sql.Date
java.sql.Time
java.sql.Timestamp
sql 包下的Date,基本和表里的对应
Date 只包含日期
Time只包含时间
Timestamp 包含日期和时间
3.
java.time.LocalDate
java.time.LocalTime
java.time.LocalDateTime
time包下的,和 表里的基本也是对应的
如果表中的字段类型是 varchar,存储的是时间,也可以用上面三类来就收。
只是,varchar 存储的 必须是正确的时间格式才行。如果存了其他非日期,会出现类型转换异常。