当我尝试在SQL Server上执行此查询时,为什么我在日期字段上获得此错误?

时间:2016-06-23 08:51:50

标签: java sql sql-server sql-server-2008 rdbms

我发现在尝试将此SQL查询(在Microsoft SQL Server 上)执行到Java应用程序时遇到了一些困难。

所以我有这个方法执行一个简单的选择查询:

public void insertOrUpdate_TIRConsolidatoPolizza(QS_TirPolizza qsTir) throws Exception {

    try{
        log.debug("PucManager.insertOrUpdate_TIRConsolidatoPolizza");

        // Reperisce i parametri della query dal parametro passato:
        String numeroPolizza = qsTir.getPolizzaid().toString();
        Long annoRiferimento = qsTir.getAnnoRiferimento();
        String dataRiferimentoNav = qsTir.getDataRiferimentoNav() != null ? "'"+qsTir.getDataRiferimentoNav()+"'" : null; 
        String timestamp = qsTir.getTimestamp() != null ? "'"+qsTir.getTimestamp()+"'" : null; 
        String sql = "select * from TirConsolidatoPolizza" +
                " where Polizzaid = " + numeroPolizza +
                " and DataRiferimentoNav = " + dataRiferimentoNav;

        log.debug("Query: " + sql);
        PreparedStatement ps = con.prepareStatement( sql );
        log.debug("Eseguo Query");
        ResultSet rs = ps.executeQuery();

        ...................................................
        ...................................................
        DO SOMETHING ELSE
        ...................................................
        ...................................................
}

String sql 变量值是(我看到它通过 log.debug()打印):

select * from TirConsolidatoPolizza where Polizzaid = 9999999999 and DataRiferimentoNav = 'Thu Jun 23 10:36:43 CEST 2016'

此查询无法正常工作,因为我似乎对 DataRiferimentoNav 值存在问题。

我收到以下错误消息:

 10:42:41  [SELECT - 0 row(s), 0.000 secs]  [Error Code: 241, SQL State: S0001]  Conversion failed when converting date and/or time from character string.

DataRiferimentoNav (db表上的 datetime )值来自 qsTir.getDataRiferimentoNav()对象字段,即一个字符串(我无法更改)代表一个日期,并在我的代码中以其他方式设置:

qsTir.setDataRiferimentoNav(new Date().toString());

那么,出了什么问题?我错过了什么?如何解决此问题并正确执行查询?

1 个答案:

答案 0 :(得分:3)

您需要正确格式化数据库要理解的日期:

Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = formatter.format(qsTir.getDataRiferimentoNav());

理想情况下,您应该避免连接SQL,因为这会导致您SQL injection vulnerabilities。尝试使用parameterized queries来实现目标。