【问题标题】:Sqlite and setting it between dates, Format Correct but still not workingSqlite 并在日期之间设置它,格式正确但仍然无法正常工作
【发布时间】:2018-02-07 23:29:19
【问题描述】:

所以我试图让一个基本的 sql 字符串工作,它将根据日期之间获取 sqlite 数据库中的记录。但是,由于某种原因,它不起作用。我只是不明白为什么。

private void viewTransactionsBetweenDatesTable(){
    //Sets the table to view transactions between certain dates

    try{
        //Get's the dates from startDateChooserTransactions1 and endDateChooserTransactions1
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat df2 = new SimpleDateFormat("MMM dd, yyyy");
        Date sdct = startDateChooserTransactions1.getDate();
        Date edct = endDateChooserTransactions1.getDate();
        String sdcts = df.format(sdct);
        String edcts = df.format(edct);
        String sdctlabel = df2.format(sdct);
        String edctlabel = df2.format(edct);

        //Child's ID
        String cid = childIDCheck1.getText();

        //Grab's the specified data and places that as the table
        String sql = "SELECT * FROM ChildrenPayment WHERE ChildID='"+cid+"' AND strftime('%Y-%m-%d', 'Report Transaction Date') BETWEEN '"+sdcts+"' AND '"+edcts+"' ";
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();

        //Sets up the table
        Info1.setModel(DbUtils.resultSetToTableModel(rs));    
        TableColumnModel tcm = Info1.getColumnModel();
        //tcm.removeColumn(tcm.getColumn(3));
       // tcm.removeColumn(tcm.getColumn(3));
       // tcm.removeColumn(tcm.getColumn(10));
       // tcm.moveColumn(11, 10);
       // tcm.removeColum(tcm.getColumn(13));

        //Changes modLabel1
        modLabel1.setText(firstNameEditClass1.getText() + " " + lastNameEditClass1.getText() + " Between " + sdctlabel + " - " + edctlabel);

    }catch(Exception e){
        JOptionPane.showMessageDialog(null, e);
    }finally{
        try{
            pst.close();
            rs.close();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e);
        }
    }
}

我使用的是 jdatechooser,因此与更好的 DateTimeFormatter 相比,我不得不使用 SimpleDateFormat。无论如何,我像 sqlite 一样根据 YYYY-MM-DD 对其进行格式化,但是当我运行该函数时,表格不显示任何内容。我将日期设置得很宽(2018 年 2 月 1 日至 2018 年 2 月 14 日),我的数据库中的日期是 2018 年 2 月 7 日。我在数据库中有几条记录可供它提取。但是,它只是不这样做。并且没有弹出错误,所以我不知道为什么它不起作用。

Image of the records that I'm trying to place into my jtable

Edit1:在我忘记之前,我还尝试了以下SQL字符串

String sql = "SELECT * FROM ChildrenPayment WHERE ChildID='"+cid+"' AND 'Report Transaction Date' BETWEEN '"+sdcts+"' AND '"+edcts+"' ";

【问题讨论】:

    标签: java sqlite jdatechooser


    【解决方案1】:

    这不起作用:

    strftime('%Y-%m-%d', 'Report Transaction Date')
    

    因为您提供的格式说明符要求您提供三个值,年、月和日各一个。

    如果数据库中的日期存储为完整的 SQLite 日期时间字符串,则必须使用

    "... date([Report Transaction Date]) BETWEEN '"+sdcts+"' AND '"+edcts+"' ";
    

    注意列名周围的方括号(不是单引号)。这与需要日期/时间值无关,这是因为列名中有空格。任何带有空格的列名都必须用双引号或方括号括起来。这就是为什么不要在列名中使用空格是个好主意。

    如果它们实际上存储为 'YYYY-MM-DD' 字符串,那么您的替代方法不起作用的原因是因为您将列名 'Report Transaction Date' 用单引号引起来,这会导致比较该文字字符串到日期值。

    【讨论】:

    • 所以我已经按照您在第二个代码块中所说的方式对其进行了测试,但出现以下错误:java.sql.SQL.Exception: near "Transaction": syntax error 此外,日期存储为 'YYYY-MM-DD' ,但类型是 DATETIME,我需要将其转换为 TEXT 吗?
    • 对,那是因为您的列名中有空格。使用双引号或方括号。 "Report Transaction Date"[Report Transaction Date]
    • 默认情况下,SQLite 将 DATETIME 类型别名(SQLite 没有本机 DATETIME 类型)视为 NUMERIC 列关联。但是,您使用的特定 Java 包装器库可能会处理到 TEXT 而不是 NUMERIC 的转换。如果数据是文本,那我就不用担心了。
    • 我在括号中添加后,它就起作用了!非常感谢您帮助我解决问题。只是为了让我了解基本原则,如果您尝试从 DATETIME 获取日期并且列有名称,则需要对带有空格的名称使用方括号而不是单引号。如果列是 TEXT,这仍然适用而不是日期时间?另外,非常感谢您的帮助。我投了赞成票,但他们不承认,因为我的排名很低。
    • 抱歉,我的评论来晚了,页面没有自动刷新。
    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2019-04-10
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多