【问题标题】:Compare DateTime with Microsoft SQL and Visual C# [duplicate]将 DateTime 与 Microsoft SQL 和 Visual C# 进行比较 [重复]
【发布时间】:2018-12-08 17:17:49
【问题描述】:

我正在尝试将 DateTime 与给定日期进行比较。

string conString = @"Provider=Microsoft.JET.OLEDB.4.0;" + @"data 
source=C:\\myDB.mdb";
OleDbConnection conn = new OleDbConnection(conString);
conn.Open();
DataSet ds = new DataSet();
String q = "SELECT * FROM Booking WHERE CheckIn < DATE()";
//String q = "SELECT * FROM Booking WHERE CheckIn < '01.01.2020'";
//String q = "SELECT * FROM Booking WHERE CheckIn < 01.01.2020";
//String q = "SELECT * FROM Booking WHERE CheckIn < '01.01.2020 00:00:00'";
//String q = "SELECT * FROM Booking WHERE CheckIn < 01.01.2020 00:00:00";
OleDbDataAdapter adapter = new OleDbDataAdapter(q, conn);
Console.WriteLine(q);
adapter.Fill(ds);
conn.Close();
DataTable dt = ds.Tables[0];
if (dt.Rows.Count > 0)
{
   MessageBox.Show(dt.Rows[0][0].ToString());
}
else
{
     MessageBox.Show("0 found");
}

代码显示了我如何将其与当前时间进行比较。它工作正常并导致

01.12.2018 00:00:00

。但是,如果我尝试将 currentTime 替换为特定值(请参阅我尝试过的内容),它会抛出 System.Data.OleDb.OleDbException 或 SQL 语法错误。我现在有点困惑,因为 DATE() 返回一个与我尝试过的格式完全相同的值。有谁知道我错过了什么?

最好的问候

克鲁斯佩

【问题讨论】:

  • Msdn有关于iso日期格式的具体例子
  • 使用参数,看我对这个问题的回答:stackoverflow.com/questions/53352625/…(你甚至可以说你的问题是重复的)
  • 日期没有格式。使用参数并传递一个日期,它将起作用。您的代码正在传递文本

标签: c# sql datetime oledb


【解决方案1】:

使用这种格式:

yyyy-MM-dd

它被称为 ISO-8601 标准日期格式,您应该在输入日期文字时始终使用它,几乎可以使用任何语言:

2020-01-01

虽然我在这里,但在引发异常的情况下,发布的代码可能会泄漏连接对象。最好将您的连接包含在 using 块中。顺便说一句,如果您为此使用参数化查询,格式会突然变得无关紧要。

string dbPath = @"C:\myDB.mdb";
string conString = $"Provider=Microsoft.JET.OLEDB.4.0;data source={dbPath}";
string q = "SELECT * FROM Booking WHERE CheckIn < ?";
Object result = null;

using (var conn = new OleDbConnection(conString))
using (var cmd = new OleDbCommand(q, conn))
{
    cmd.Parameters.Add("Date", OleDbType.Date).Value = new DateTime(2020, 1, 1);
    Console.WriteLine(q);
    result = cmd.ExecuteScalar();
}

if (result == null || result == DBNull.Value)
{
    result = "0 found";
}
MessageBox.Show(result.ToString());

【讨论】:

  • 非常感谢。完美运行。
  • 我只需要打开和关闭连接
  • @kruspe 当您“手动”关闭连接并且您的代码在此之前出现异常时,连接不会关闭。通过使用“使用”,您可以确定无论发生什么连接都会关闭
  • @Kruspe 做 NOT 添加代码来打开/关闭连接。 .Fill() 方法已经为您处理了这个问题,using 块在确保连接关闭方面比您的旧代码做得更好。
  • 但是,你写它的方式,它给我一个错误,说“连接状态:关闭”
猜你喜欢
  • 2016-11-24
  • 2018-09-16
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
相关资源
最近更新 更多