【问题标题】:Conversion failed when converting date and/or time from character string SQL Server 2016从字符串 SQL Server 2016 转换日期和/或时间时转换失败
【发布时间】:2017-06-24 18:22:39
【问题描述】:

你好,所以我有一个这些代码,你可以将年、月、日所有字符串输入到文本字段中,然后它将它们组合成一个字符串并使用语句使查询将其转换为日期和在这里将它和一些其他数据插入数据库是代码。

    int CustomerID = Integer.parseInt(txtCustomerID.getText());
    int CarID = Integer.parseInt(txtCarID.getText());
    String startdateyear = txtStartDateYear.getText();
    String startdatemonth = txtStartDateMonth.getText();
    String startdateday = txtStartDateDay.getText();
    String enddateyear = txtEndDateYear.getText();
    String enddatemonth = txtEndDateMonth.getText();
    String enddateday = txtEndDateDay.getText();
    String StartDate = startdateyear + startdatemonth + startdateday;
    String EndDate = enddateyear + enddatemonth + enddateday;
    int HiringPrice = Integer.parseInt(txtHiringPrice.getText());
    String Pay = txtPay.getText();
    carDA.insert(CustomerID, CarID, StartDate, EndDate, HiringPrice, Pay);/

这是插入查询:

stm.executeUpdate("INSERT INTO CarOrder VALUES (" + CarID +"," + CustomerID +",CONVERT(DATE," + "'" +StartDate+ "', 111), CONVERT(DATE," + "'" +EndDate+"', 111)," +HiringPrice+ "," +"'"+Pay+ "')");

当我运行程序时,它会抛出以下消息:

Conversion failed when converting date and/or time from character string.

我似乎无法找出为什么会这样,如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 了解预处理语句以防止 SQL 注入。它还将解决您的转换器问题
  • @Jens 当你说It will also solve your converter problem 时,我不明白你能不能检查一下我上面的回答是不是你的意思是正确的?

标签: java sql-server date jdbc type-conversion


【解决方案1】:

您输入的日期格式似乎不正确,应该是这样的:

convert(datetime, '2017/06/24', 111) -- yyyy/mm/dd

因为您使用的是111,所以您的输入应该类似于yyyy/mm/dd,阅读更多关于CAST and CONVERT (Transact-SQL)的信息


为避免语法错误或 SQL 注入,我建议改用 PreparedStatement,它更有用且更安全。

DateFormat format = new SimpleDateFormat("yyyy/mm/dd");

String query = "INSERT INTO CarOrder VALUES (?, ?, CONVERT(DATE, ?, 111), CONVERT(DATE, ?, 111), ?, ?)";
try (PreparedStatement insert = connection.prepareStatement(query)) {
    insert.setInt(1, CustomerID);
    insert.setDate(2, new Date);
    insert.setDate(3, format.parse(StartDate));
    insert.setDate(4, format.parse(EndDate));
    insert.setDouble(5, HiringPrice);//i think the price is a double maybe you make it int or float so you have to use the right type
    insert.setString(6, Pay);

    insert.executeUpdate();
}

【讨论】:

  • 如果您需要 convert 语句,我不太可能,但是我的意思是这样
  • 为什么要投反对票?操作员说它有效,那么为什么要投反对票
【解决方案2】:

你在这里得到无效的字符串:

String StartDate = startdateyear + startdatemonth + startdateday;

例如 startdateyear = '2016', startdatemonth = '4', startdateday = '1' --> StartDate = '201641' --> select CONVERT(DATE,'201641', 111) -->

Msg 241, Level 16, State 1, Line 1 转换时转换失败 字符串中的日期和/或时间。

到底为什么你使用yy/mm/dd 的111 格式,而你的字符串根本不包含/? '201641' 被解释为 year=2020, month=16, day=41

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多