Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

sử dụng kiểu dữ liệu datetimeoffset với jTDS

Như đã đề cập trong phần "Tương thích ngược cho khách hàng cấp dưới" của datetimeoffset tài liệu , chúng tôi có thể làm việc với các biểu diễn chuỗi của datetimeoffset các giá trị. Trên thực tế, nếu chúng tôi truy xuất datetimeoffset với jTDS 1.3.1, chúng ta nhận được một java.lang.String giá trị của biểu mẫu

YYYY-MM-DD hh:mm:ss[.nnnnnnn] {+|-}hh:mm

Giá trị như vậy có thể được phân tích cú pháp như sau:

// rs is our ResultSet object
String valueRetrieved = rs.getString(1);  // e.g., "2016-12-08 12:34:56.7850000 -07:00"
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS ZZZZZ");
ZonedDateTime zdt = ZonedDateTime.parse(valueRetrieved, dtf);

Đối với việc viết datetimeoffset giá trị cho SQL Server, jTDS không thể xử lý bản cập nhật đúng cách bằng .setTimestamp , ví dụ:trên máy của tôi ...

java.sql.Timestamp ts = java.sql.Timestamp.valueOf("2016-12-08 12:34:56.785");  // local
String tsString = formatTimestampForDateTimeOffset(ts);  // (see below)
System.out.printf("             java.sql.TimeStamp value: %s (%d ms since epoch)%n", tsString, ts.getTime());

System.out.println();
System.out.println("Saving via setTimestamp ...");
String sqlUpdate = "UPDATE dtoTable SET dtoCol = ? WHERE id=1";
try (PreparedStatement s = conn.prepareStatement(sqlUpdate)) {
    s.setTimestamp(1, ts);  // pass the Timestamp itself
    s.executeUpdate();
}
String valueRetrieved;
try (
        Statement s = conn.createStatement();
        ResultSet rs = s.executeQuery("SELECT dtoCol FROM dtoTable WHERE id=1")) {
    rs.next();
    valueRetrieved = rs.getString(1);
    System.out.printf("    jTDS saved the TimeStamp value as: %s%n", valueRetrieved);
}

... sản xuất ...

         java.sql.TimeStamp value: 2016-12-08 12:34:56.785 -07:00 (1481225696785 ms since epoch)

Saving via setTimestamp ...
jTDS saved the TimeStamp value as: 2016-12-08 12:34:56.7870000 +00:00

... không chỉ đặt sai lệch múi giờ thành +00:00 (mà không thay đổi chính giá trị ngày / giờ), nó còn thêm vài mili giây chỉ để giải trí.

Tuy nhiên, nếu chúng tôi chuyển đổi giá trị Dấu thời gian thành Chuỗi được định dạng đúng, ví dụ:...

public static String formatTimestampForDateTimeOffset(java.sql.Timestamp ts) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ZZZZZ");
    String s = sdf.format(new Date(ts.getTime()));
    // T-SQL *requires* the colon in the timezone offset: -07:00, not -0700
    int colonPosition = s.length() - 2;
    return s.substring(0, colonPosition) + ":" + s.substring(colonPosition);
}

... và sử dụng .setString thay vì .setTimestamp , rồi đến datetimeoffset giá trị được lưu chính xác:

Saving via setString ...
jTDS saved the formatted String as: 2016-12-08 12:34:56.7850000 -07:00
           parsed to ZonedDateTime: 2016-12-08T12:34:56.785-07:00
              converted to Instant: 2016-12-08T19:34:56.785Z
       converted to java.util.Date: Thu Dec 08 12:34:56 MST 2016



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn giá trị chuỗi hex vào trường hình ảnh máy chủ sql đang nối thêm 0

  2. Danh sách các toán tử so sánh máy chủ SQL

  3. Kích hoạt và cập nhật thành một hàng trong SQL Server sau khi nó được cập nhật

  4. Chế độ xem trong SQL Server

  5. Tạo chế độ xem chỉ đọc trong Sql Server