将 DATETIME 从 SQLite 解析为 java.SQL.Timestamp 时出错
Error when parsing DATETIME from SQLite to java.SQL.Timestamp
我正在使用 java 11 和 SQLite 3.30.1 制作桌面 windows 电脑应用程序。在我的 sql table "Alarms" 中,我有一个日期 (DATETIME) 列,我尝试使用 jdbc resultset.getTimestamp() 检索它。但是我收到以下错误:"java.sql.SQLException: Error parsing time stamp"。
因为这是一个警报管理器,所以我想存储日期和时间。我还希望能够从另一个日期中减去 2 个日期。
这是我的闹钟 table:
CREATE TABLE "alarms" (
"id" INTEGER NOT NULL,
"date" DATETIME NOT NULL,
"name" TEXT,
"text" TEXT NOT NULL,
PRIMARY KEY("id")
);
这是我的闹钟 java class:
import java.io.Serializable;
import java.sql.Timestamp;
public class Alarms implements Serializable {
private int id;
private Timestamp date;
private String name;
private String text;
public Alarms() {
}
public Alarms(int id, Timestamp date, String name, String text) {
this.id = id;
this.date = date;
this.name = name;
this.text = text;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Timestamp getDate() {
return date;
}
public void setDate(Timestamp date) {
this.date = date;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
这是我的javajdbc方法:
public ObservableList<Alarms> getAlarms() {
alarmsList.clear();
try {
s = "SELECT * FROM alarms";
statement = connection.createStatement();
resultSet = statement.executeQuery(s);
while (resultSet.next()) {
Alarms al = new Alarms();
al.setId(resultSet.getInt(1));
al.setDate(resultSet.getTimestamp(2));
al.setName(resultSet.getString(3));
al.setText(resultSet.getString(4));
alarmsList.add(al);
}
return alarmsList;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
所以问题是,如何使用 jdbc 在 SQLite 中存储、插入和检索日期+时间?我做错了什么?
根据 spec,SQLite 中没有 DATETIME
类型。
它将被转换为 NUMERIC
。您可以在请求中使用各种函数来获得您想要的:date & time functions
经过一整天的搜索,我找到了解决方案。在您的 SQLite table 中,您可以完美地使用 DATETIME 来存储日期+time.SQLite 会将其存储为字符串。我的table如下:
CREATE TABLE "alarms" (
"id" INTEGER NOT NULL,
"date" DATETIME NOT NULL,
"name" TEXT,
"text" TEXT NOT NULL,
PRIMARY KEY("id")
);
因为 SQLite returns 一个字符串,你必须在 java 中的结果集上使用 "getString()"。该字符串是一个 Long 数字,例如 1588370406005 。
所以我不得不在我的警报 java class 中添加一些额外的 getter 和 setter。
这是我的闹钟 java class:
import java.io.Serializable;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class Alarms implements Serializable {
private int id;
private LocalDateTime date;
private String name;
private String text;
public Alarms() {
}
public Alarms(int id, LocalDateTime date, String name, String text) {
this.id = id;
this.date = date;
this.name = name;
this.text = text;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public LocalDateTime getDate() {
return date;
}
public String getDateStringFormat(){
return Long.toString(date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
public void setDate(LocalDateTime date) {
this.date = date;
}
public void setDate(String stringDate){
date= Instant.ofEpochMilli(Long.parseLong(stringDate)).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
我的JDBC方法是:
public ObservableList<Alarms> getAlarms() {
alarmsList.clear();
try {
s = "SELECT * FROM alarms";
statement = connection.createStatement();
resultSet = statement.executeQuery(s);
while (resultSet.next()) {
Alarms al = new Alarms();
al.setId(resultSet.getInt(1));
al.setDate(resultSet.getString(2));
al.setName(resultSet.getString(3));
al.setText(resultSet.getString(4));
alarmsList.add(al);
}
return alarmsList;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
希望这对某人有所帮助。
我正在使用 java 11 和 SQLite 3.30.1 制作桌面 windows 电脑应用程序。在我的 sql table "Alarms" 中,我有一个日期 (DATETIME) 列,我尝试使用 jdbc resultset.getTimestamp() 检索它。但是我收到以下错误:"java.sql.SQLException: Error parsing time stamp"。 因为这是一个警报管理器,所以我想存储日期和时间。我还希望能够从另一个日期中减去 2 个日期。 这是我的闹钟 table:
CREATE TABLE "alarms" (
"id" INTEGER NOT NULL,
"date" DATETIME NOT NULL,
"name" TEXT,
"text" TEXT NOT NULL,
PRIMARY KEY("id")
);
这是我的闹钟 java class:
import java.io.Serializable;
import java.sql.Timestamp;
public class Alarms implements Serializable {
private int id;
private Timestamp date;
private String name;
private String text;
public Alarms() {
}
public Alarms(int id, Timestamp date, String name, String text) {
this.id = id;
this.date = date;
this.name = name;
this.text = text;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Timestamp getDate() {
return date;
}
public void setDate(Timestamp date) {
this.date = date;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
这是我的javajdbc方法:
public ObservableList<Alarms> getAlarms() {
alarmsList.clear();
try {
s = "SELECT * FROM alarms";
statement = connection.createStatement();
resultSet = statement.executeQuery(s);
while (resultSet.next()) {
Alarms al = new Alarms();
al.setId(resultSet.getInt(1));
al.setDate(resultSet.getTimestamp(2));
al.setName(resultSet.getString(3));
al.setText(resultSet.getString(4));
alarmsList.add(al);
}
return alarmsList;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
所以问题是,如何使用 jdbc 在 SQLite 中存储、插入和检索日期+时间?我做错了什么?
根据 spec,SQLite 中没有 DATETIME
类型。
它将被转换为 NUMERIC
。您可以在请求中使用各种函数来获得您想要的:date & time functions
经过一整天的搜索,我找到了解决方案。在您的 SQLite table 中,您可以完美地使用 DATETIME 来存储日期+time.SQLite 会将其存储为字符串。我的table如下:
CREATE TABLE "alarms" (
"id" INTEGER NOT NULL,
"date" DATETIME NOT NULL,
"name" TEXT,
"text" TEXT NOT NULL,
PRIMARY KEY("id")
);
因为 SQLite returns 一个字符串,你必须在 java 中的结果集上使用 "getString()"。该字符串是一个 Long 数字,例如 1588370406005 。 所以我不得不在我的警报 java class 中添加一些额外的 getter 和 setter。 这是我的闹钟 java class:
import java.io.Serializable;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class Alarms implements Serializable {
private int id;
private LocalDateTime date;
private String name;
private String text;
public Alarms() {
}
public Alarms(int id, LocalDateTime date, String name, String text) {
this.id = id;
this.date = date;
this.name = name;
this.text = text;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public LocalDateTime getDate() {
return date;
}
public String getDateStringFormat(){
return Long.toString(date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
public void setDate(LocalDateTime date) {
this.date = date;
}
public void setDate(String stringDate){
date= Instant.ofEpochMilli(Long.parseLong(stringDate)).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
我的JDBC方法是:
public ObservableList<Alarms> getAlarms() {
alarmsList.clear();
try {
s = "SELECT * FROM alarms";
statement = connection.createStatement();
resultSet = statement.executeQuery(s);
while (resultSet.next()) {
Alarms al = new Alarms();
al.setId(resultSet.getInt(1));
al.setDate(resultSet.getString(2));
al.setName(resultSet.getString(3));
al.setText(resultSet.getString(4));
alarmsList.add(al);
}
return alarmsList;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
希望这对某人有所帮助。