【问题标题】:How can i get the Start Date and End Date with LIKE % C#如何使用 LIKE % C# 获取开始日期和结束日期
【发布时间】:2019-03-05 20:28:26
【问题描述】:

like 之间的正确日期语法是什么?这是我的示例代码。我收到查询错误

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    MySqlDataAdapter sda = new MySqlDataAdapter(
        "SELECT `empID`, `Name`, `Date`, `empIn`, `empOut`, `workhours`, `workhoursTotal`, `workhoursLate`, `workhoursLateTotal`, `overtime`, `minuteOvertime`, `Reason`, `undertime`, `undertimeTotalMin`, `status`, `Payslip` FROM `attendance`"
        + " WHERE  Date BETWEEN LIKE '" 
        + dateTimePicker1.Value.ToString("yyyy-MM-dd") 
        + "%' AND Date LIKE'" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "%'", con);

    DataTable data = new DataTable();
    sda.Fill(data);
    dataGridView1.DataSource = data;
}

【问题讨论】:

标签: c# mysql database


【解决方案1】:

如果您将 DateTime 值转换为字符串以便在 SQL 中使用,那么您正在做的事情非常错误。使用参数化查询让 ADO.Net 为您处理这个问题。作为奖励,这将保护您免受 SQL 注入攻击,并且通常表现更好。

此外,将LIKEBETWEEN 一起使用完全没有意义。就此而言,BETWEEN 本身对于日期比较通常是不好的做法,因为它包含范围的两端。更好的做法是将日期在>= 的位置与范围的开头进行比较,并将<(没有=)在范围末尾的第二天的第一时刻.

看起来您还试图在整个应用程序或表单中重复使用相同的连接对象。 不要那样做。 ADO.Net 有一个称为连接池的功能,它会以更有效的方式为您处理这个问题。您确实想为大多数查询创建一个新的连接对象。

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    var result = new DataTable();
    string sql = @"
        SELECT `empID`, `Name`, `Date`, `empIn`, `empOut`, `workhours`, `workhoursTotal`, 
           `workhoursLate`, `workhoursLateTotal`, `overtime`, `minuteOvertime`, `Reason`, 
           `undertime`, `undertimeTotalMin`, `status`, `Payslip` 
        FROM `attendance`
        WHERE `Date` > @StartDate AND `Date` <= @EndDate";

    using (var con = new MySqlConnection("connection string here"))
    using (var cmd = new MySqlCommand(sql, con))
    using (var sda = new MySqlDataAdapter(cmd))
    {
        cmd.Parameters.Add("@StartDate", MySqlDbType.DateTime).Value =  dateTimePicker1.Value.Date;
        cmd.Parameters.Add("@StartDate", MySqlDbType.DateTime).Value =  dateTimePicker2.Value.Date.AddDays(1);
 
        sda.Fill(result);
    }
    dataGridView1.DataSource = result;
}

【讨论】:

    【解决方案2】:

    首先,您确定您的 dateTimePicker 有信息吗?将值直接发送到数据库不是一个好习惯。 其次代码有很多错误:

    MySqlDataAdapter sda = new MySqlDataAdapter("SELECTempID,Name,Date,empIn,empOut,workhours,workhoursTotal,workhoursLate,workhoursLateTotal,overtime,minuteOvertime,Reason,undertime,undertimeTotalMin,status,PayslipFROMattendance` WHERE Date BETWEEN LIKE '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "%' AND Date LIKE'" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "%'", con);
    

    SELECT 后面,FROM 前后,最后一个Like 有一个空格,请检查你在MySQL 中的代码,然后将它复制到c# 中。应该是这样的:

        MySqlDataAdapter sda = new MySqlDataAdapter("SELECT empID, Name, Date, empIn, empOut, workhours, workhoursTotal, workhoursLate, workhoursLateTotal, overtime, minuteOvertime, Reason, undertime, undertimeTotalMin, status, Payslip 
    FROM Mattendance WHERE Date BETWEEN '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "' AND '" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "' ", con);
    

    可能还有更多语法错误,但您可以自行检查。

    第三个对日期时间使用“Like”是没有意义的,所以只需使用 BETWEEN。

    最后在日期时间中使用它来避免格式​​问题。

    dateTimePicker1.Value.ToString(CultureInfo.InvariantCulture)
    

    【讨论】:

    • 先生,他还选择了三月的日期
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多