从SQLite解析DATETIME到java.SQL.Timestamp时出错。

问题描述 投票:0回答:2

我正在使用java 11和SQLite 3.30.1制作一个桌面Windows PC应用程序。在我的sql表 "Alarms "中,我有一个日期(DATETIME)列,我试图使用jdbc resultset.getTimestamp()来检索它。但我得到以下错误。"java.sql.SQLException.Error parsing time stamp": 错误解析时间戳"。因为这是一个报警管理器,我想存储日期+时间。我还希望能够从一个日期中分出两个日期。

CREATE TABLE "alarms" (
"id"    INTEGER NOT NULL,
"date"  DATETIME NOT NULL,
"name"  TEXT,
"text"  TEXT NOT NULL,
PRIMARY KEY("id")
);

这是我的Alarms java类:

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;
}
}

这是我的java 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.getTimestamp(2)); 
            al.setName(resultSet.getString(3));
            al.setText(resultSet.getString(4));

            alarmsList.add(al);

        }
        return alarmsList;

    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    return null;
}

所以问题是,我如何在SQLite中使用jdbc存储,插入和检索Date+time? 我做错了什么?

java sql sqlite jdbc datetime-parsing
2个回答
0
投票

没有 DATETIME 在SQLite中,根据 规范.

它将被转换为 NUMERIC. 你可以使用各种函数来请求得到你想要的东西。日期& 时间函数


0
投票

经过一整天的搜索,我找到了一个解决方案。在你的SQLite表中,你可以完美地使用DATETIME来存储日期+时间,SQLite会将其存储为字符串。我的表是这样的。

CREATE TABLE "alarms" (
"id"    INTEGER NOT NULL,
"date"  DATETIME NOT NULL,
"name"  TEXT,
"text"  TEXT NOT NULL,
PRIMARY KEY("id")
);

由于SQLite返回的是一个字符串, 你必须在java的结果集上使用 "getString()". 这个字符串是一个Long的数字,比如1588370406005.所以我必须在我的Alarms java类中添加一些额外的getter和setter.这是我的Alarm java类。

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;
}

希望这能帮助到别人。

© www.soinside.com 2019 - 2024. All rights reserved.