如何通过 SQL 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?

Posted

技术标签:

【中文标题】如何通过 SQL 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?【英文标题】:How to get data from DB table between two specific dates(specified by user) by SQL statement? 【发布时间】:2015-10-23 22:12:24 【问题描述】:

这是我的代码..我出错了

“UCanAccess 错误 - net.ucanaccess.jdbc.UcanaccessSQLException:操作中的数据类型不兼容:在下一行..

PreparedStatement pStmt = conn.prepareStatement(sql)

public void showCeilingMaterials(Site_Details site_detail) 

    String sql="SELECT SiteName, SUM(PlanTileQuantity), SUM(PlanTilePrice), SUM(PellingQuantity),SUM(PellingPrice), SUM(PowderQuantity),SUM(PowderPrice),SUM(LpattiQuantity),SUM(LpattiPrice),LpattiSize,SUM(CeilingTotalPrice) FROM CeilingMaterials Where SiteName='?' AND Date<='?' AND Date>=?";
        try (PreparedStatement pStmt = conn.prepareStatement(sql)) 
            SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
            java.util.Date parsed = format.parse(site_detail.getStartDate());
            java.sql.Date sql_date1 = new java.sql.Date(parsed.getTime());
            format.format(sql_date1);
            java.util.Date parsed1 = format.parse(site_detail.getEndDate());
            java.sql.Date sql_date2 = new java.sql.Date(parsed1.getTime());
            format.format(sql_date2);
            pStmt.setString(1, site_detail.getSiteName());
            pStmt.setDate(2, sql_date1);
            pStmt.setDate(2,sql_date2);
            ResultSet rs= pStmt.executeQuery();
            while(rs.next())
                showCeil.setSiteName(rs.getString("SiteName"));
                showCeil.setTileQuantity(rs.getString("PlanTileQuantity"));
                showCeil.setTilePrice(rs.getString("PlanTilePrice"));
                showCeil.setPellingQuantity(rs.getString("PellingQuantity"));
                showCeil.setPellingPrice(rs.getString("PellingPrice"));
                showCeil.setLpattiQuantity(rs.getString("LpattiQuantity"));
                showCeil.setLpattiPrice(rs.getString("LpattiPrice"));
                showCeil.setLpattiSize(rs.getString("LpattiSize"));
                showCeil.setPowderQuantity(rs.getString("PowderQuantity"));
                showCeil.setPowderPrice(rs.getString("PowderPrice"));
                showCeil.setTotalCeilingPrice(rs.getString("CeilingTotalPrice"));
                show_ceil_w=new Site_Details_Show_Interface();
                show_ceil_w.showGui(showCeil);
            
        
    

【问题讨论】:

去掉参数FROM CeilingMaterials Where SiteName=? AND Date&lt;=? AND Date&gt;=?"中的单个qoutes 【参考方案1】:

参数化查询的 SQL 命令文本不得在参数占位符周围包含引号(或其他分隔符)。您有以下内容,这是不正确的:

... Where SiteName='?' AND Date<='?' AND Date>=?

具体来说,是 Date&lt;='?' 导致了问题中引用的错误,尽管错误消息在 UCanAccess 的较新版本(在本例中为 v3.0.2)中略有不同:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.2 不兼容的数据类型组合

相反,你需要有

... Where SiteName=? AND [Date]<=? AND [Date]>=?

[请注意,Date 是 Access 中的保留字(内置函数名称),因此如果要引用名为 Date 的列,则应在其周围使用方括号。]

一旦该错误得到纠正,您的 SQL 中的其他错误就会显现出来。您必须解决的下一个问题是:

net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc:::3.0.2 表达式不在聚合或 GROUP BY 列中:PUBLIC.CEILINGMATERIALS.SITENAME

因为您已将 SiteName 包含在要返回的列列表中,但它不是聚合函数(例如,MIN()MAX())或 GROUP BY 子句的一部分。 LpattiSize 也有同样的问题。

你也有

pStmt.setDate(2, sql_date1);
pStmt.setDate(2,sql_date2);

您已经为参数 #2 赋值了两次(因此参数 #3 没有值)。

最后,请注意,当您在不提供别名的情况下对列进行 SUM() 时,如

SELECT ... SUM(PlanTileQuantity), ...

结果列将命名为“PlanTileQuantity”。 UCanAccess 将为其分配一个任意列名称,如“C1”、“C2”等。最好明确分配一个别名,例如,

SELECT ... SUM(PlanTileQuantity) AS SumOfPlanTileQuantity, ...

【讨论】:

Gord Thompson,但是我在更正 sql 语句后得到了与上面相同的错误..

以上是关于如何通过 SQL 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 SQL 中两个特定日期之间的最长周期?

如何在查询语句 Mysql 中格式化日期?

从sql表里截取字符串中的日期

mysql 存储过程

MySQL存储过程

MySQL存储过程