C# MSACCESS DateTIme SQL查询

C# MSACCESS DateTIme SQL查询,c#,sql,.net,ms-access,oledb,C#,Sql,.net,Ms Access,Oledb,我来自印度(这可能与这里的文化信息有关)。我正在用C#.Net 2010 Express构建一个桌面应用程序,以MS-ACCESS 2010 32位作为后端。我正在使用OLEDB进行db连接。 我有一个名为dt的列作为日期/时间,它有以下值: 20-09-2016 22:53:32 2016年8月19日22:54:24 20-09-2016 22:56:01 22-09-2016 22:56:27 22-09-2016 22:56:41 我需要按日期、月份和年份取记录。 到目前为止,我无法完成日

我来自印度(这可能与这里的文化信息有关)。我正在用C#.Net 2010 Express构建一个桌面应用程序,以MS-ACCESS 2010 32位作为后端。我正在使用OLEDB进行db连接。 我有一个名为dt的列作为日期/时间,它有以下值:

20-09-2016 22:53:32
2016年8月19日22:54:24
20-09-2016 22:56:01
22-09-2016 22:56:27
22-09-2016 22:56:41

我需要按日期、月份和年份取记录。 到目前为止,我无法完成日期部分,因此无法按月和按年工作。以下是我的代码:

b.com.CommandText = "SELECT * FROM srvtrans WHERE DateTime.Parse(dt)=@a ORDER BY sno DESC";
b.com.Parameters.Add("@a", dtp_srdmy.Value.ToShortDateString());
Show(dtp_srdmy.Value.ToShortDateString());
b.con.State == ConnectionState.Closed)
 con.Close();
mytemp = new DataTable();
da.Fill(mytemp);
我还尝试了以下变化:

WHERE CONVERT(VARCHAR(10),dt,111)=@a

WHERE CONVERT(VARCHAR(10),dt,101)=@a

WHERE dt LIKE '%@a%' 

WHERE DateTime.Parse(dt)=@a 

WHERE dt=DateValue(@a)

WHERE CAST(dt AS DATE)=@a

WHERE CONVERT(varchar, dt, 101)=@a

WHERE DATE(dt)=@a

WHERE dt=@a
但是没有一个适合我。请回答sql查询中应该进行哪些更新,以便按日期、月份和年份获取记录。提前谢谢

b.com.CommandText = "SELECT * FROM srvtrans WHERE dt = @a ORDER BY sno DESC";
b.com.Parameters.Add(new System.Data.OleDb.OleDbParameter("@a", OleDbType.DBDate) {Value = dtp_srdmy.Value });
con.Open();
  • 您希望传入参数值的本机类型,而不是类型的字符串表示形式。我假设
    dtp\u srdmy
    可能是一个用户控件(正如下面评论中的
    @Gord Thompson
    所指出的,可能是一个日期时间选择器)或其他类型,
    Value
    是一个返回
    DateTime
    实例的属性
  • 如果要直接比较,则基础存储/提供程序将为您处理比较,因此不要尝试用记号、引号或其他方式包装您的值,也不要尝试对存储引擎进行转换
  • 您应该使用
    OleDbType
    枚举指定底层访问类型,我猜它是
    DBDate
    ,但我可能错了,请在必要时更正它
  • 在执行任何命令之前打开连接。我假设您正在使用数据适配器,但没有看到它,请确保它与您的命令相关联。我省略了代码的这一部分,因为它与问题无关
  • 您希望传入参数值的本机类型,而不是类型的字符串表示形式。我假设
    dtp\u srdmy
    可能是一个用户控件(正如下面评论中的
    @Gord Thompson
    所指出的,可能是一个日期时间选择器)或其他类型,
    Value
    是一个返回
    DateTime
    实例的属性
  • 如果要直接比较,则基础存储/提供程序将为您处理比较,因此不要尝试用记号、引号或其他方式包装您的值,也不要尝试对存储引擎进行转换
  • 您应该使用
    OleDbType
    枚举指定底层访问类型,我猜它是
    DBDate
    ,但我可能错了,请在必要时更正它
  • 在执行任何命令之前打开连接。我假设您正在使用数据适配器,但没有看到它,请确保它与您的命令相关联。我省略了代码的这一部分,因为它与问题无关

以下代码应该绝对有效:

  b.com.CommandText = "SELECT * FROM srvtrans WHERE DATEVALUE(dt)=DATEVALUE(@a) ORDER BY sno DESC";
  b.com.Parameters.Add("@a", dtp_srdmy.Value);

如果这有帮助,请向上投票。

以下代码肯定可以工作:

  b.com.CommandText = "SELECT * FROM srvtrans WHERE DATEVALUE(dt)=DATEVALUE(@a) ORDER BY sno DESC";
  b.com.Parameters.Add("@a", dtp_srdmy.Value);

如果有帮助,请向上投票。

此外,请查看行
b.con.State==ConnectionState.Closed
,检查是否已关闭,然后再次关闭。您应该做的是在需要时创建一个新的OLEDB连接,并将其包装在using块中。查看哪一行提供了有关如何最佳构造ado.net代码的一些提示。此外,请查看行
b.con.State==ConnectionState.Closed
,检查是否已关闭,然后再次关闭。您应该做的是在需要时创建一个新的OLEDB连接,并将其包装在using块中。请参阅关于如何最佳构造ado.net代码的一些提示。“我假设
dtp\u srdmy
是一个可为空的日期时间实例”-“dtp\u”前缀表示它是一个属性为
DateTime
DateTimePicker
对象。不过,这仍然是一个很好的答案+1@GordThompson-啊哈,这更有道理。谢谢你好很抱歉,我写错了con.close()。我把它改成了b.con.Open();是的,dtp是一个c#.net日期时间选择器控件。Dataadapter存在并绑定在单独的类中。我用datareader和DataAdapter尝试了上述建议,但仍然得到了0行。“我假设
dtp\u srdmy
是一个可为空的DateTime实例”-“dtp\u”前缀表示它是一个
DateTimePicker
对象,其属性是
DateTime
。不过,这仍然是一个很好的答案+1@GordThompson-啊哈,这更有道理。谢谢你好很抱歉,我写错了con.close()。我把它改成了b.con.Open();是的,dtp是一个c#.net日期时间选择器控件。Dataadapter存在并绑定在单独的类中。我用datareader和datadapter尝试了上述建议,但仍然得到了0行。