• java.sql.Date、java.sql.Time 和 java.sql.Timestamp


    大多数数据库支持三种形式的日期时间字段,即 DATE、TIME 和 TIMESTAMP。它们中的每一个在 JDBC 中都有一个对应的类,并且它们中的每一个都扩展了java.util.Date。这三个是:

    • java.sql.Date表示 SQL DATE,存储年、月和日,没有时间组件。java.sql.Date 不考虑时区。
    • java.sql.Time表示 SQL TIME,仅包含有关小时、分钟、秒和毫秒的信息,不包含日期组件。
    • java.sql.Timestamp表示 SQL TIMESTAMP,它包含精确到纳秒精度的日期和时间信息。

    让我们检查下表,参考前 5 个数据库(不按顺序)日期时间数据类型:

    DatabaseSQL DATESQL TIMESQL TIMESTAMPSource
    MySQL / MariaDBDATE
    DATETIME
    TIMETIMESTAMPLink
    Link
    PostgreSQLDATETIME
    TIME WITH TIME ZONE
    TIMESTAMP
    TIMESTAMP WITH TIME ZONE
    Link
    OracleDATETIMESTAMP
    TIMESTAMP WITH TIME ZONE
    TIMESTAMP WITH LOCAL TIME ZONE
    Link
    Microsoft SQL ServerDATE
    SMALLDATETIME
    DATETIME
    DATETIME2
    DATETIMEOFFSET
    TIMELink
    IBM Db2DATETIMETIMESTAMPLink

    我把来源,我的参考放在最右边的栏中。如我错了请纠正我

    使用 JDBC 类

    选择哪个类取决于字段的 SQL 类型。PreparedStatement 具有所有三个值的设置器,setDate() 用于 java.sql.Date,setTime() 用于 java.sql.Time 和 setTimestamp() 用于 java.sql.Timestamp。

    让我们举个例子,我们在数据库中创建一个测试表。对于本文,我将使用 MySQL。

    1. CREATE TABLE test_datetime (
    2. dtm_date DATE,
    3. dtm_time TIME,
    4. dtm_timestamp TIMESTAMP,
    5. obj_date DATE,
    6. obj_time TIME,
    7. obj_timestamp TIMESTAMP
    8. );
    然后我们将当前日期/时间(通过 new java.util.Date() 获取)插入到 SQL 数据库表的日期字段中。
    SqlDateTimeInsertExample.java
    1. import java.sql.Connection;
    2. import java.sql.DriverManager;
    3. import java.sql.PreparedStatement;
    4. public class SqlDateTimeInsertExample {
    5. public static void main(String[] args) throws Exception {
    6. // (1) connect to mysql database
    7. String url = "jdbc:mysql://localhost/coffeehouse?serverTimezone=Asia/Singapore";
    8. Class.forName("com.mysql.cj.jdbc.Driver");
    9. try (Connection conn = DriverManager.getConnection(url, "barista", "cappuccino")) {
    10. // (2) set java.sql.Date, Time, and Timestamp with current Date (and time)
    11. java.util.Date utilDate = new java.util.Date();
    12. java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
    13. java.sql.Time sqlTime = new java.sql.Time(utilDate.getTime());
    14. java.sql.Timestamp sqlTS = new java.sql.Timestamp(utilDate.getTime());
    15. // (3) insert java.sql.Date, Time and Timestamp (including objects) to DB
    16. String sql = "INSERT INTO test_datetime("
    17. + "dtm_date, dtm_time, dtm_timestamp,"
    18. + "obj_date, obj_time, obj_timestamp) VALUES (?,?,?,?,?,?)";
    19. try (PreparedStatement pst = conn.prepareStatement(sql)) {
    20. pst.setDate(1, sqlDate);
    21. pst.setTime(2, sqlTime);
    22. pst.setTimestamp(3, sqlTS);
    23. pst.setObject(4, utilDate);
    24. pst.setObject(5, utilDate);
    25. pst.setObject(6, utilDate);
    26. // (4) execute update
    27. pst.executeUpdate();
    28. }
    29. }
    30. }
    31. }

    如上例,使用 setObject(int parameterIndex , x Object); 我们可以只给最后三个参数一个 util.Date ,它们可以毫无问题地接受它(这也发生在另一个 JDBC 驱动程序中,而不仅仅是 MySQL)。但是只是懒惰地使用 setObject(...) 会导致一些问题,包括数据(或部分数据)丢失。

    注意: URL 后缀 ?serverTimezone=Asia/Singapore 是为了抑制:线程“main”中的异常 java.sql.SQLException:服务器时区值“马来半岛标准时间”无法识别或代表多个时区。如果要使用时区支持,则必须配置服务器或 JDBC 驱动程序(通过 serverTimezone 配置属性)以使用更具体的时区值。

    (你能看到上面 MySQL JDBC 错误消息中的错字吗?:p)

    连接mysql确认结果:

    1. $ mysql -u barista -p
    2. Enter password: **********
    3. Welcome to the MySQL monitor. Commands end with ; or \g.
    4. Your MySQL connection id is 9
    5. Server version: 5.5.27 MySQL Community Server (GPL)
    6. mysql> connect coffeehouse
    7. Connection id: 10
    8. Current database: coffeehouse
    9. mysql> select * from test_datetime;
    10. +------------+----------+---------------------+------------+----------+---------------------+
    11. | dtm_date | dtm_time | dtm_timestamp | obj_date | obj_time | obj_timestamp |
    12. +------------+----------+---------------------+------------+----------+---------------------+
    13. | 2019-08-15 | 15:48:19 | 2019-08-15 15:48:19 | 2019-08-15 | 15:48:19 | 2019-08-15 15:48:19 |
    14. +------------+----------+---------------------+------------+----------+---------------------+
    15. 1 row in set (0.00 sec)

  • 相关阅读:
    【疑难杂症】-一种简单高效的Spring Security oauth token兼容JSON格式的办法
    Maven安装(超详解)
    HashMap为什么会发生死循环?
    java基于springboot+vue的人才推荐求职招聘系统
    Java Integer bitCount()方法具有什么功能呢?
    C# 自定义事件
    力扣刷题之2970.统计移除递增子数组的数目I
    GreenPlum6.x之测试数据
    【Mysql性能优化系列】Mysql优化方案你知道哪些
    关于简单线性代数——矩阵乘法与行列式
  • 原文地址:https://blog.csdn.net/allway2/article/details/126075724