将 DateTime 与 Microsoft SQL 和 Visual C# 进行比较

Compare DateTime with Microsoft SQL and Visual C#

我正在尝试将 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() returns 的值与我尝试过的格式完全相同。有谁知道我错过了什么?

此致

克鲁斯佩

使用这种格式:

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