当我尝试在 SQL 服务器上执行此查询时,为什么会在日期字段上出现此错误?
Why I obtain this error on a date field when I try to perform this query on SQL Server?
我发现在尝试将此 SQL 查询(在 Microsoft SQL Server 上)执行到 Java 应用程序中时遇到一些困难。
所以我有这个方法来执行一个简单的 select 查询:
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(它是数据库 table 上的 datetime)值取自 qsTir.getDataRiferimentoNav() 对象字段,它是一个 String (我不能更改它)代表一个日期,并且在我的其他地方以这种方式设置代码:
qsTir.setDataRiferimentoNav(new Date().toString());
那么,怎么了?我错过了什么?我该如何解决这个问题并正确执行我的查询?
您需要正确设置日期格式才能被数据库理解:
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = formatter.format(qsTir.getDataRiferimentoNav());
理想情况下,您应该避免连接 SQL,因为这可以引导您 SQL injection vulnerabilities. Try to use parameterized queries 实现您的目标。
我发现在尝试将此 SQL 查询(在 Microsoft SQL Server 上)执行到 Java 应用程序中时遇到一些困难。
所以我有这个方法来执行一个简单的 select 查询:
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(它是数据库 table 上的 datetime)值取自 qsTir.getDataRiferimentoNav() 对象字段,它是一个 String (我不能更改它)代表一个日期,并且在我的其他地方以这种方式设置代码:
qsTir.setDataRiferimentoNav(new Date().toString());
那么,怎么了?我错过了什么?我该如何解决这个问题并正确执行我的查询?
您需要正确设置日期格式才能被数据库理解:
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = formatter.format(qsTir.getDataRiferimentoNav());
理想情况下,您应该避免连接 SQL,因为这可以引导您 SQL injection vulnerabilities. Try to use parameterized queries 实现您的目标。