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

`Java.lang.String` を `oracle.sql.TIMESTAMPTZ` に変換します

    タイムスタンプは、標準の Java 解析可能な形式ではありません。したがって、それらを解析するには、そのような形式を処理するためのカスタム コードを記述する必要があります。

    上記の点を念頭に置いて、次のコードは必要なことを行います。

        SimpleDateFormat dateFormatTZGeneral = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");
        SimpleDateFormat dateFormatTZISO = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS XXX");
        SimpleDateFormat dateFormatWithoutTZ = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    
    
        String[][] zoneStrings = DateFormatSymbols.getInstance().getZoneStrings();
    
        Date date = null;
    
        String[] timeStampSplits = timestamp.split(" ");
        if(timeStampSplits.length>2) {
    
            String timezone = timeStampSplits[2];
            //First Case Asia/Calcutta
            if(Character.isAlphabetic(timezone.charAt(timezone.length()-1))) {
    
                for(String[] zoneString: zoneStrings) {
                    if(zoneString[0].equalsIgnoreCase(timezone)) {
                        timeStampSplits[2] = zoneString[2];
                        break;
                    }
                }
    
                timestamp = createString(timeStampSplits," ");
                date = getDate(timestamp, dateFormatTZGeneral);
            } else {
                //Second Case 8:00
                timeStampSplits[2] = formatTimeZone(timeStampSplits[2]);
    
                timestamp = createString(timeStampSplits," ");
                date = getDate(timestamp, dateFormatTZISO);
            }
    
        } else {
            // Third Case without timezone
            date = getDate(timestamp, dateFormatWithoutTZ);
        }
    
        System.out.println(date);
    
        TIMESTAMPTZ oraTimeStamp = new TIMESTAMPTZ(<connection object>,new java.sql.Timestamp(date.getTime());
    

    上記のコードは次のユーティリティ メソッドを使用します

    private static Date getDate(String timestamp, SimpleDateFormat dateFormat) {
        Date date = null;
        try {
            date = dateFormat.parse(timestamp);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return date;
    }
    
    private static String createString(String[] contents, String separator) {
        StringBuilder builder = new StringBuilder();
        for (String content : contents) {
            builder.append(content).append(separator);
        }
        builder.deleteCharAt(builder.length()-separator.length());
    
        return builder.toString();
    }
    
    private static String formatTimeZone(String timeZone) {
        String[] timeZoneSplits = timeZone.split(":");
        DecimalFormat formatter = new DecimalFormat("+##;-#");
        formatter.setMinimumIntegerDigits(2);
    
        timeZoneSplits[0] = formatter.format(Integer.parseInt(timeZoneSplits[0]));
        return createString(timeZoneSplits, ":");
    }
    

    このコードは、タイムスタンプの例に対応するために特別に作成されたものです。逸脱はこれで処理されない可能性があり、さらにカスタマイズする必要があります。

    これがお役に立てば幸いです。



    1. 日付のみを使用してDATETIME列から選択するにはどうすればよいですか?

    2. カンマ区切りのSQLであるIDを使用する

    3. Pythonパンダ-to_sqlを使用して大きなデータフレームをチャンクに書き込む

    4. java.sql.SQLException:列数が行1エラーの値数と一致しません