Вот программа на Java, которую я сделал.
Программа сканирует данный файл (измените имя в приведенном ниже коде) на
CAST(0x... AS DateTime)
и заменяет их соответствующими
CAST('yyyy-MM-dd HH:mm:ss.SSS' AS DateTime)
.
Например, учитывая, что SELECT CAST (0x00009CEF00A25634 as datetime)
возвращает 2009-12-30 09:51:03.000
, программа сканирует файл на наличие CAST(0x00009CEF00A25634 AS DateTime)
и заменяет их на CAST('2009-12-30 09:51:03.000' AS DateTime)
.
Я использовал его, чтобы преобразовать сгенерированный SQL Server сценарий в то, что может понять встроенная база данных H2.
Хотя он работал нормально для меня, я советую вам проверить его (просто запустите некоторые тестовые данные и посмотрите) перед использованием на реальных данных.
import java.io.*;
import java.text.*;
import java.util.*;
import java.util.regex.*;
public class ReplaceHexDate {
public static void main(String[] args) throws Exception {
String inputFile = "C:/input.sql";
String inputEncoding = "UTF-8";
String outputFile = "C:/input-replaced.sql";
String outputEncoding = "UTF-8";
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), inputEncoding));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), outputEncoding));
String line;
while ((line = br.readLine()) != null) {
if (line.indexOf("CAST(0x") > -1) {
bw.write(replaceHexWithDate(line));
} else {
bw.write(line);
}
bw.newLine();
}
br.close();
bw.flush();
bw.close();
}
private static String replaceHexWithDate(String sqlLine) throws ParseException {
Pattern castPattern = Pattern.compile("(CAST\\()(0x[A-Fa-f0-9]{16})( AS DateTime\\))");
Matcher m = castPattern.matcher(sqlLine);
while (m.find()) {
String s = m.group(2);
sqlLine = sqlLine.replace(s, "'"+sqlServerHexToSqlDate(s)+"'");
}
return sqlLine;
}
public static String sqlServerHexToSqlDate(String hexString) throws ParseException {
String hexNumber = hexString.substring(2); // removes the leading 0x
String dateHex = hexNumber.substring(0, 8);
String timeHex = hexNumber.substring(8, 16);
long daysToAdd = Long.parseLong(dateHex, 16);
long millisToAdd = (long) (Long.parseLong(timeHex, 16) *10/3);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Calendar startingCal = Calendar.getInstance();
String startingDate = "1900-01-01 00:00:00.000";
startingCal.setTime(sdf.parse(startingDate));
Calendar convertedCal = Calendar.getInstance();
convertedCal.setTime(sdf.parse(startingDate));
convertedCal.add(Calendar.DATE, (int) daysToAdd);
convertedCal.setTimeInMillis(convertedCal.getTimeInMillis() + millisToAdd);
return sdf.format(convertedCal.getTime());
}
}