我想比较sql server的日期时间函数值和选中的列值

时间:2016-09-08 08:26:33

标签: java sql sql-server date time

这是我的代码2016-09-08 05:57:03.513,这是我想要比较的日期 - 时间格式。

我认为转换有问题。

我想将所选行与sql列进行比较,其中我使用了getdate函数,该函数具有上述类型的日期时间

try {
    String buy_qty=qtycus.getText();
    Integer bq= Integer.parseInt(buy_qty);
    Integer aa = sell_outside_cus.getSelectedRow();
    String rr=sid_sell.getSelectedItem().toString();
    String dat = sell_outside_cus.getValueAt(aa,2).toString();
    System.out.println(dat);
    Date result;
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mi:ss.mmm ");
    try {
        result = formatter.parse (dat);
        System.out.println(result);

        String namesup = sell_outside_cus.getValueAt(aa,4).toString();
        Integer s_avilable=Integer.parseInt(namesup);
        Integer rest= s_avilable-bq;
        System.out.println(rest);
        try {
            String sql=("UPDATE supreg SET available_stock=('"+rest+"') where ((SupplementId='"+rr+"')AND(supadd_date='"+result+"'))");
            pst = con.prepareStatement(sql);
            rs= pst.executeQuery();
        } catch(Exception e) {
            JOptionPane.showMessageDialog(null, e);          
        }
    } catch (ParseException ex) {
        JOptionPane.showMessageDialog(null, ex);
    }
} catch(Exception e) {
    JOptionPane.showMessageDialog(null, e); 
}

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

String sql = ("UPDATE supreg SET available_stock=? where ((SupplementId=?)AND(supadd_date=to_date(?, yyyy-mm-dd hh24:mi:ss))");
pst = con.prepareStatement(sql);
pst.setInt(1, rest);
pst.setString(2, dat);
rs = pst.executeQuery();

不要这样写:

String sql=("UPDATE supreg SET available_stock=('"+rest+"') where ((SupplementId='"+rr+"')AND(supadd_date='"+result+"'))");

因为这段代码错误的SQL注入

答案 1 :(得分:0)

  

我使用了一个getdate函数,它具有上面类型的日期时间

这不是真的!! GETDATE()会返回类型安全DATETIME。你看到的是为人类读者准备的字符串表示。使用哪种格式取决于文化设置。您永远不应该在字符串级别上比较日期/时间值...

您的命令:

在这一行中,您将通过在正确的位置连接所有值来创建命令,就像您在SSMS或SQL控制台中编写它一样。

String sql=("UPDATE supreg SET available_stock=('"+rest+"') where ((SupplementId='"+rr+"')AND(supadd_date='"+result+"'))");

这是一种不好的方法,因为

  • 你必须自己处理一个值的正确字符串表示,这可能相当混乱。日期时间 - 由于文化差异,价值观特别容易出现问题!
  • 这是开放的SQL注入(高安全风险)

好方法

使用参数代替串联。这使它的类型安全可靠。

糟糕的方法

如果必须坚持这一点,则必须确保有效的字符串文字

DateTime可能会被放入这些格式(2016.12.31 23:59:59的所有示例)

  • unseparated(仅限日期):" 20161231"
  • ISO 8601:" 2016-12-31T23:59:59"
  • ODBC(仅限日期):" {d' 2016-12-31'}"
  • ODBC(日期和时间):" {ts' 2016-12-31 23:59:59'}"
  • ODBC(仅限时间):" {t' 23:59:59'}"

为避免隐式演员,你应该写一些类似

的内容
AND(supadd_date=CONVERT(DATETIME,'"+result+"',key))

虽然key是您选择的格式from here, e.g. 126 for ISO8601

的正确值

任何其他格式都可能导致例外或误解(例如2016-09-08可能是9月或8月的日期。这取决于系统的文化)。