• 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)

  • 相关阅读:
    国产操作系统生态建设,小程序技术来帮忙
    软考 - 04 分布式缓存系统
    华为攻击防范简介
    golang ES 聚合查询
    流媒体服务器ZLMediaKit与FFmpeg
    webpack热更新原理解析
    基于Java+SpringBoot+Vue前后端分离人事管理系统设计和实现
    wpa-supplicant移植
    YOLO-NAS详细教程-姿势估计实现
    git通过SSH指定秘钥文件克隆代码的三种方法
  • 原文地址:https://blog.csdn.net/allway2/article/details/126075724