基于服务的数据库SQL Select语句,日期不起作用

时间:2017-03-11 09:45:36

标签: c# sql-server database

在我的代码中,当时日期之间的日期不相同。

在datebase中,DueDate字段被选为日期类型而非日期时间

sqlString = "Select [VehiNo], [DueDate], [Works] From [Daily] Where [DueDate] <= '" + today.ToShortDateString() + "' and [ServiceDate] Is NULL";
MessageBox.Show(sqlString);

using (SqlCommand cmd = new SqlCommand(sqlString, conn))
{
    cmd.CommandType = CommandType.Text;
    SqlDataReader reader = cmd.ExecuteReader();
    dtDue.Load(reader);
}
if (dtDue.Rows.Count > 0)
{
    dataListOverDue.DataSource = dtDue;
    dataListOverDue.Columns["VehiNo"].HeaderText = "Vehicle No";
}

Database Table

Data Loaded in WinForm

我有3个数据网格视图和3个sql语句,每个用于查找今天到期的截止日期到期日期到期,并已到期。

我尝试了很多东西,但没有一个工作,我不知道为什么。 我已经尝试了这样的参数。

string sqlString = "Select [VehiNo], [DueDate], [Works] From [Daily] Where [DueDate]='@today' and [ServiceDate] Is NULL";
cmd.Parameters.AddWithValue("@today", today.ToString());

sqlString = string.Format("Select [VehiNo], [DueDate], [Works] From [Daily] Where [DueDate] Between '@today' And '@next'");
cmd.Parameters.AddWithValue("@today", today.ToString());
cmd.Parameters.AddWithValue("@next", next.ToString());

选择=不返回任何内容

选择中间给出转换失败错误

选择&lt; =返回我在图像中显示的所有日期。

2 个答案:

答案 0 :(得分:0)

尝试以下

string sqlFormattedDate = today.ToString("yyyy-MM-dd HH:mm:ss.fff");

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

并使用sqlFormattedDate

不要使用字符串连接,请使用参数化查询。传入DateTime类型的参数值。这样可以完全避免格式化问题,提高后续查询的性能,并解决在以这种方式形成SQL时您可以打开的固有漏洞(SQL注入)。

"where @dateTime <= DateTimeField"

答案 1 :(得分:0)

问题在于您生成查询并向其添加参数的方式。

您不需要将查询参数包装在单引号内。如果列和参数的数据类型匹配,您也不需要转换参数值ToString()。

通过以下解决方案。

string sqlString = "Select [VehiNo], [DueDate], [Works] From [Daily] Where [DueDate] = @today and [ServiceDate] Is NULL";

var sqlCommand = new SqlCommand();
sqlCommand.CommandText = sqlString;
sqlCommand.Parameters.Add("@today", SqlDbType.DateTime);
sqlCommand.Parameters["@today"].Value = today;

var next = today.AddDays(20);
sqlString = string.Format("Select [VehiNo], [DueDate], [Works] From [Daily] Where [DueDate] Between @today And @next");
sqlCommand.Parameters.Add("@today", SqlDbType.DateTime);
sqlCommand.Parameters["@today"].Value = today;
sqlCommand.Parameters.Add("@next", SqlDbType.DateTime);
sqlCommand.Parameters["@next"].Value = next;

这可以解决您的问题。