【问题标题】:I want to compare sql servers date time function value and selected columns value我想比较 sql server 日期时间函数值和选定列值
【发布时间】:2017-01-16 02:21:39
【问题描述】:

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

我认为转换有问题。

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

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); 
}

【问题讨论】:

    标签: java sql sql-server date time


    【解决方案1】:

    我使用了一个 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 的所有示例)

    • 未分隔(仅日期):“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 月的日期。这取决于系统的文化)。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      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注入

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 2017-06-01
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 2014-01-09
        • 2012-06-08
        相关资源
        最近更新 更多