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

  • 相关阅读:
    连线上视新闻|「DaoCloud 道客」创始人解说云原生新赛道
    C语言 题目 1760: 字符序列模式识别
    slurm是什么,怎么用? For slurm和For Pytorch有什么区别和联系?
    入门力扣自学笔记84 C++ (题目编号736)(未理解)
    微信小程序开发---条件渲染和列表渲染
    短视频创作,变现的建议、变现方式和举例,建议收藏反复阅读-上
    volatile-可见性案例详解
    浅析主流跨端技术方案
    人机交互复习总结5
    Unreal 输入系统 解析
  • 原文地址:https://blog.csdn.net/allway2/article/details/126075724