Java 来自 SQLite 的数据分析错误
Java dataparse error from SQLite
我在尝试从我的 SQLite 数据库中检索数据时遇到错误。
它将第一行数据检索到 table 但是当日期存在时它给出如下所示的错误。
这是我出错的代码。
try {
con = DriverManager.getConnection("jdbc:sqlite:Rooms.db");
con.setAutoCommit(false);
pst = con.prepareStatement("Select * from Standard");
rs = pst.executeQuery();
while (rs.next())
{
LocalDate sD = null;
LocalDate eD = null;
if (rs.getDate(6) != null)
{
sD = Conv(rs.getDate(6));
eD = Conv(rs.getDate(7));
System.out.println(sD + " " + eD);
if (chkIn.getValue().isBefore(sD) == true && chkOut.getValue().isBefore(eD) == true)
{
datas.add(new StandardRoomList(rs.getString(1), rs.getString(2) , "£" + (rs.getInt(3)*pri), "" + rs.getInt(4)));
}
}
这是我遇到的错误:
Caused by: java.text.ParseException: Unparseable date: "2017-11-17" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
at org.sqlite.date.FastDateParser.parse(FastDateParser.java:299)
at org.sqlite.date.FastDateFormat.parse(FastDateFormat.java:490)
at org.sqlite.jdbc3.JDBC3ResultSet.getDate(JDBC3ResultSet.java:293)
... 64 more
错误消息中的模式暗示 JDBC 驱动程序需要 "YYYY-MM-DD HH:MM:SS.milliseconds" 形式的字符串。这与您数据库中的日期表示不兼容。
这里的根本问题是 SQLite 不支持日期/时间/时间戳类型:
- SQLite JDBC rs.getDate() getTimestamp() etc. all return wrong values
您似乎已将日期编码为数据库中的字符串,并且 JDBC 驱动程序似乎正在尝试使用内置启发式将这些字符串值转换为日期/时间值。但这是失败的。
我建议使用 getString 从结果集中检索值,然后使用 Java 的内置日期/时间 类 明确地进行字符串 -> 日期转换。
另一种方法是使用 org.sqlite.SQLiteConfig
对象更改 JDBC 驱动程序的默认日期时间格式。但是,我找不到任何关于这种方法的文档......除了源代码!
我在尝试从我的 SQLite 数据库中检索数据时遇到错误。
它将第一行数据检索到 table 但是当日期存在时它给出如下所示的错误。
这是我出错的代码。
try {
con = DriverManager.getConnection("jdbc:sqlite:Rooms.db");
con.setAutoCommit(false);
pst = con.prepareStatement("Select * from Standard");
rs = pst.executeQuery();
while (rs.next())
{
LocalDate sD = null;
LocalDate eD = null;
if (rs.getDate(6) != null)
{
sD = Conv(rs.getDate(6));
eD = Conv(rs.getDate(7));
System.out.println(sD + " " + eD);
if (chkIn.getValue().isBefore(sD) == true && chkOut.getValue().isBefore(eD) == true)
{
datas.add(new StandardRoomList(rs.getString(1), rs.getString(2) , "£" + (rs.getInt(3)*pri), "" + rs.getInt(4)));
}
}
这是我遇到的错误:
Caused by: java.text.ParseException: Unparseable date: "2017-11-17" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
at org.sqlite.date.FastDateParser.parse(FastDateParser.java:299)
at org.sqlite.date.FastDateFormat.parse(FastDateFormat.java:490)
at org.sqlite.jdbc3.JDBC3ResultSet.getDate(JDBC3ResultSet.java:293)
... 64 more
错误消息中的模式暗示 JDBC 驱动程序需要 "YYYY-MM-DD HH:MM:SS.milliseconds" 形式的字符串。这与您数据库中的日期表示不兼容。
这里的根本问题是 SQLite 不支持日期/时间/时间戳类型:
- SQLite JDBC rs.getDate() getTimestamp() etc. all return wrong values
您似乎已将日期编码为数据库中的字符串,并且 JDBC 驱动程序似乎正在尝试使用内置启发式将这些字符串值转换为日期/时间值。但这是失败的。
我建议使用 getString 从结果集中检索值,然后使用 Java 的内置日期/时间 类 明确地进行字符串 -> 日期转换。
另一种方法是使用 org.sqlite.SQLiteConfig
对象更改 JDBC 驱动程序的默认日期时间格式。但是,我找不到任何关于这种方法的文档......除了源代码!