sql >> データベース >  >> RDS >> Sqlserver

jTDSでdatetimeoffsetデータ型を使用する

    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の記述について SQL Serverの値、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. Railsでjsonbを使用する方法

    2. JDBCでのJTableへのデータ呼び出しを最適化する

    3. SQLで数値を丸める方法

    4. mySQLクエリをLaravel5.4クエリビルダーに変換する方法