Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

jTDS के साथ डेटाटाइमऑफ़सेट डेटाटाइप का उपयोग करना

जैसा कि datetimeoffset के "डाउन-लेवल क्लाइंट्स के लिए बैकवर्ड कम्पैटिबिलिटी" सेक्शन में बताया गया है दस्तावेज़ीकरण , हम datetimeoffset . के स्ट्रिंग अभ्यावेदन के साथ काम कर सकते हैं मूल्य। वास्तव में, यदि हम एक datetimeoffset . प्राप्त करते हैं jTDS 1.3.1 के साथ मान हमें एक java.lang.String मिलता है फॉर्म का मूल्य

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

इस तरह के मान को इस प्रकार पार्स किया जा सकता है:

// 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);

datetimeoffset writing लिखने के लिए SQL सर्वर के लिए मान, jTDS .setTimestamp . का उपयोग करके अपडेट को ठीक से संभालने में असमर्थ है , जैसे, मेरी मशीन पर...

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);
}

... उत्पादन करता है ...

         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

... जो न केवल गलत तरीके से टाइमज़ोन ऑफ़सेट को +00:00 (दिनांक/समय मान को बदले बिना) पर सेट करता है, यह केवल मनोरंजन के लिए कुछ मिलीसेकंड भी जोड़ता है।

हालांकि, अगर हम टाइमस्टैम्प मान को उचित रूप से स्वरूपित स्ट्रिंग में परिवर्तित करते हैं, उदाहरण के लिए, ...

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);
}

... और .setString . का उपयोग करें इसके बजाय .setTimestamp , फिर datetimeoffset मान सही ढंग से सहेजा गया है:

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. SQL सर्वर 2012 एक्सप्रेस में यूनिकोड

  2. SQL सर्वर में फ़ंक्शन-आधारित अनुक्रमणिका

  3. SQL सर्वर में केस संवेदनशील चर

  4. Sql Server 2008 भूगोल लाइनस्ट्रिंग आकार सीमाएँ

  5. SQL सर्वर PIVOT शायद?